假设我有一个包含 dd-MM-yyyy_HH-mm-ss
时间后跟 _name.txt
的 .txt 文件的文件夹。我希望能够先按名称排序,然后再按时间排序。示例:
之前
- 15-2-2010_10-01-55_greg.txt
- 10-2-1999_10-01-55_greg.txt
- 10-2-1999_10-01-55_jason.txt
之后
- greg_1_10-2-1999_10-01-55
- greg_2_15-2-2010_10-01-55
- 杰森_1_10-2-1999_10-01-55
编辑:抱歉,从我的“cp”行开始,我打算将它们复制到另一个目录中,并使用不同的名称。
我尝试做的是制作一个带有计数的副本,但它没有根据日期正确地对具有相同名称的文件进行排序:
cd data/unfilteredNames
for filename in *.txt; do
n=${filename%.*}
n=${filename##*_}
filteredName=${n%.*}
count=0
find . -type f -name "*_$n" | while read name; do
count=$(($count+1))
cp -p $name ../filteredNames/"$filteredName"_"$count"
done
done
最佳答案
不确定文件重命名是否符合您的期望之一。至少对于仅对文件名进行排序,您不需要。
你可以只使用 GNU sort
来做到这一点命令:
sort -t- -k5.4 -k3.1,3.4 -k2.1,2.1 -k1.1,1.2 -k3.6,3.13 <(printf "%s\n" *.txt)
-t
将字段分隔符设置为破折号 -
.
-k
能够根据字段进行排序。如 man sort
中所述页,语法为 -k<start>,<stop>
其中 <start>
或由 <field number>.<position>
组成.添加几个 -k
该命令的选项允许对多个字段进行排序;命令行中的第一个优先级高于另一个。
例如第一个-k5.4
告诉基于偏移量为 4 个字符的第 5 个字段进行排序。没有停止字段,因为这是文件名的结尾。
-k3.1,3.4
选项根据第 3 个字段从偏移量 1 到 4 排序。
同样的原则适用于其他-k
选项。
在您的示例中,月份字段只有一位数字。如果您的文件的月份编码为 2 位数字,您可能希望用 0 填充所有月份的文件名。这可以通过添加到 printf
来完成声明此 <(... | sed 's/-0\?\([0-9]\)/-0\1/')
并更改 -k 2.1,2.1
通过 -k2.1,2.2
.
关于linux - 如何在 BASH 中按名称排序然后修改日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52471319/