bash - 使用 xargs 获取参数索引?

标签 bash sorting file-sorting

在 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/

相关文章:

bash - 如何让 git show --stat 仅列出更改的文件数、插入和删除?

linux - 使用管道命令创建 AWK For 循环

python - 使用 Python 列出命令的输出

bash - 扫描文件一次并从中切割不同的东西?

sorting - 如何根据数值对 slice 进行排序,如果数值等于则按字母顺序排序

python - 排序列表时避免不必要的键评估

javascript - 使用 javascript 和表排序器动态获取时无法对日期列进行排序

Java 大文件排序器