在 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)
这会处理带有所有特殊字符的文件名,如空格、换行符、全局字符等,因为我们在 -printf
选项中以 NUL 或 \0
字符结尾每个文件名。请注意,我们还使用 sort -z
来处理以 NUL 结尾的数据。
关于bash - 使用 xargs 获取参数索引?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40658336/