list——全职使用ls和文件列表



我使用find /path/ -name *.zip > ~/ziplist.txt收集了一个远程磁盘中的zip列表。

~/ziplist.txt看起来像这样:

./path/to/the/file.zip
./path/to/the/file2.zip
./path/to/the/file3.zip
./path/to/the/very/nice/file.zip

我使用grep过滤了这个列表,现在我必须在.txt文件中更正列表,我想将其提供给ls x --full-time以收集它们的时间戳(x是文件列表)。

可能吗?

我尝试这样做:for f in tmp.txt do echo $( ls $f --full-time) done

编辑:我尝试的另一件事是:cat tmp.txt | sed- "s/(.*)/'1'/" ; ls --full-time $(!!)sed部分是需要的,因为显然文件名中有空格…否则,如果文件没有空格,这个$(!!)就可以正常工作。

一个可以工作的解决方案,我想也是ls -R --full-time | grep "what I want" > listfile.txt,但我认为这将需要很长时间来运行。有小的步骤是必要的,这样我可以检查列表长度,因为我的磁盘访问有时会被关闭。运行find已经花了我一个小时了。

注意:我在windows10上使用git bash来运行命令,所以我不能运行复杂的.sh脚本。我更喜欢用一个终端入口来运行它。我知道,这不是最好的配置。

可以将文件的内容直接嵌入到命令中。

$: ls --full-time $(<~/ziplist.txt)

在这种情况下,不要引用文件插入,因为这会将文件的整个内容视为单个文件名。

要单独读取它们,不要读取带有for循环的行。

while read -r file; do ls --full-time "$file"; done < ~/ziplist.txt

较慢,但允许您引用文件名以避免诸如嵌入空格之类的问题。

在你花太多时间在这上面之前,请阅读为什么你不应该解析ls输出。

出口。统计

mapfile -t lst < ~/ziplist.txt && stat -c "%x %n" "${lst[@]}"
2021-06-18 13:44:18.351339200 -0500 dev
2021-10-21 20:50:20.649098700 -0500 sts
2021-10-21 09:11:37.398341900 -0500 file
2021-10-25 08:13:03.788650200 -0500 a b c

注意dev在这里是一个目录,a b c有嵌入的空格。
X、Y和Z分别报告访问、修改和状态变化,大写的单位是自epoch以来的秒数,小写的单位是人工解析的日期/时间,带有小数秒数和时区信息。

如果没有空格,@Paul Hodges的答案可以正常工作。但这是我的情况,所以这里有一些信息。

第一步,我找到所有zip文件所在的位置,并将它们保存在一个txt文件中:find /disk/Path/ -name *.zip > ~/ziplist.txt

然后在该文件中使用grep查找与我的项目相关的文件grep keyword ziplist.txt > mylist.txt我使用wc -l mylist.txt ; cat mylist.txt来检查这个列表。

现在我想了解一些关于这个文件列表的时间信息。由于其中有空格,文件路径被破坏。首先,我需要修改内部字段分隔符(IFS),代码如下:

OLD_IFS=$IFS
IFS=$'n'

由于我在windows上,行尾(EOL)与新的IFS不兼容。所以我需要用这个帮助来代替这个

dos2unix mylist.txt

现在我可以在mylist.txt中使用stat了。

stat $(cat /Disk/Path/mylist.txt) --format %w%z > ~timefile.txt

最新更新