我使用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