我有一个目录
我的主要目录是/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 -tr
到sed
用逗号连接第一行和最后一行:选项-n
抑制默认输出,1h
将第一行(最新的文件名)保存在保留空间,并在文件的最后一行(由 选择$
)将保留空间(最新的文件名)附加H
到模式空间(由换行符分隔),并将换行符更改为逗号。
然后,该脚本printf
将子目录名称后跟一个逗号,然后是来自sed
.
这对最旧/最新选择的目录和文件没有区别,因此如果您不想要目录,则需要过滤输出ls -t
以删除目录。