在 bash 中,我有所有名称相同的文件列表(在不同的子目录中),我想按创建/修改时间对它们进行排序,如下所示:
ls -1t /tmp/tmp-*/my-file.txt | xargs ...
我想用某种索引或其他东西重命名这些文件,这样我就可以将它们全部移动到同一个文件夹中。我的结果理想情况下是这样的:
my-file0.txt
my-file1.txt
my-file2.txt
类似的东西。我该怎么做呢?
在 bash 中,我有所有名称相同的文件列表(在不同的子目录中),我想按创建/修改时间对它们进行排序,如下所示:
ls -1t /tmp/tmp-*/my-file.txt | xargs ...
我想用某种索引或其他东西重命名这些文件,这样我就可以将它们全部移动到同一个文件夹中。我的结果理想情况下是这样的:
my-file0.txt
my-file1.txt
my-file2.txt
类似的东西。我该怎么做呢?
您可以遍历这些文件并继续将递增计数器附加到所需的文件名:
for f in /tmp/tmp-*/my-file.txt; do
fname="${f##*/}"
fname="${fname%.*}"$((i++)).txt
mv "$f" "/dest/dir/$fname"
done
编辑:为了对列出的文件进行排序,我的修改时间与ls -1t
您可以使用此脚本一样:
while IFS= read -d '' -r f; do
f="${f#* }"
fname="${f##*/}"
fname="${fname%.*}"$((i++)).txt
mv "$f" "/dest/dir/$fname"
done < <(find /tmp/tmp-* -name 'my-file.txt' -printf "%T@ %p\0" | sort -zk1nr)
这处理带有所有特殊字符的文件名,如空格、换行符、全局字符等,因为我们以 NUL 或选项中\0
的字符结尾每个文件名-printf
。请注意,我们也sort -z
用于处理 NUL 终止的数据。
所以我找到了我自己问题的答案,对此有什么想法?
ls -1t /tmp/tmp-*/my-file.txt | awk 'BEGIN{ a=0 }{ printf "cp %s /tmp/all-the-files/my-file_%03d.txt\n", $0, a++ }' | bash;
我从另一个堆栈溢出问题中找到了这个,寻找我的搜索一开始没有找到的类似内容。awk 线给我留下了深刻的印象,认为那很整洁。