3

在 bash 中,我有所有名称相同的文件列表(在不同的子目录中),我想按创建/修改时间对它们进行排序,如下所示:

ls -1t /tmp/tmp-*/my-file.txt | xargs ...

我想用某种索引或其他东西重命名这些文件,这样我就可以将它们全部移动到同一个文件夹中。我的结果理想情况下是这样的:

my-file0.txt
my-file1.txt
my-file2.txt

类似的东西。我该怎么做呢?

4

2 回答 2

2

您可以遍历这些文件并继续将递增计数器附加到所需的文件名:

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 终止的数据。

于 2016-11-17T15:13:06.803 回答
1

所以我找到了我自己问题的答案,对此有什么想法?

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 线给我留下了深刻的印象,认为那很整洁。

于 2016-11-17T16:01:50.257 回答