list --full-time 使用 ls 和文件列表

list --full-time with ls and a file list

我使用 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/\(.*\)/''/" ; ls --full-time $(!!) sed 部分是必需的,因为 显然 文件名中有 space ...否则,如果文件没有 space,这$(!!) 工作正常。

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

注意:我在 windows10 上使用 git bash 到 运行 命令,所以我不能 运行 详细说明 .sh 脚本。与 运行 相比,我更喜欢单个终端条目。我知道,不是最好的配置。

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

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

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

要单独阅读它们,don't read lines with for loops

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

速度较慢,但​​允许您引用文件名以避免嵌入空格等问题。

在你花太多时间之前,请阅读为什么你应该 not parse ls output

c.f。 stat

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 分别报告访问、修改和状态更改,自纪元以来的秒数为大写,人工解析的小写 date/time 带有小数秒和时区信息。

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

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

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

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

OLD_IFS=$IFS
IFS=$'\n'

因为我在 windows,行尾 (EOL) 与新的 IFS 不兼容。所以我需要用 help.

替换它
dos2unix mylist.txt

现在我可以在 mylist.txt 上使用统计数据了。

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