在bash中,我的文件列表都是相同的(在不同的子目录中),我想按创建/修改时间对它们进行排序,如下所示:
my-file0.txt
my-file1.txt
my-file2.txt
我想用某种索引或其他东西重命名这些文件,以便我可以将它们全部移动到同一个文件夹中。我的结果理想情况如下:
grep '[3]\.\08' GDCBAdapter.log
这样的事情。我该怎么做呢?
答案 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系列印象深刻,认为它非常整洁。