Bash 命令从每个文件夹递归获取第一个和最后一个文件

Bash 命令从每个文件夹递归获取第一个和最后一个文件

我有一个目录

我的主要目录是/tmp/folder

里面/tmp/folder只有 X 个文件夹(不是文件)。例如

/tmp/folder/1
/tmp/folder/2
/tmp/folder/3
/tmp/folder/4
/tmp/folder/5

这些文件夹内有许多具有相同扩展名的文件。我想从每个文件夹中获取最后一个和第一个创建的文件(修改时间)。

我更喜欢这样的输出

/tmp/folder/1,OLD_FILE,NEW_FILE
/tmp/folder/2,OLD_FILE,NEW_FILE
/tmp/folder/3,OLD_FILE,NEW_FILE
/tmp/folder/4,OLD_FILE,NEW_FILE
/tmp/folder/5,OLD_FILE,NEW_FILE

我将使用脚本解析此输出,因此您可以执行任何您想要的输出,但请以友好的方式执行,以便我可以轻松解析它。

bash命令应该只有1

答案1

find "$DIR" -type d | while read d; do echo "$d,$(ls -t "$d" | sed -n '1h; $ { G; s/\n/,/g; p }')"; done

或者,采用更易读的格式并使用额外的变量进行演示:

find "$DIR" -type d |
while read d;
do
    files=$(ls -t "$d" | sed -n '1h; $ { G; s/\n/,/g; p }')
    printf '%s,%s\n' "$d" "$files";
done

$DIR这会找到使用该命令的所有子目录find。对于找到的每个文件,用于ls -tr获取该目录中按日期排序的文件列表,最新的在前。

将 的输出通过管道连接ls -trsed用逗号连接第一行和最后一行:选项-n抑制默认输出,1h将第一行(最新的文件名)保存在保留空间,并在文件的最后一行(由 选择$)将保留空间(最新的文件名)附加H到模式空间(由换行符分隔),并将换行符更改为逗号。

然后,该脚本printf将子目录名称后跟一个逗号,然后是来自sed.

这对最旧/最新选择的目录和文件没有区别,因此如果您不想要目录,则需要过滤输出ls -t以删除目录。

相关内容