用xargs获取参数索引?

时间:2016-11-17 15:07:28

标签: bash sorting file-sorting

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

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

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

grep '[3]\.\08' GDCBAdapter.log

这样的事情。我该怎么做呢?

2 个答案:

答案 0 :(得分: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)

这会处理包含所有特殊字符(如空格,换行符,glob字符等)的文件名,因为我们在\0选项中使用NUL或-printf字符结束每个文件名。请注意,我们还使用sort -z来处理NUL终止的数据。

答案 1 :(得分: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系列印象深刻,认为它非常整洁。