可以说我有一个.txt文件文件夹,该文件夹的时间为dd-MM-yyyy_HH-mm-ss
,后跟_name.txt
。我希望能够先按名称排序,然后再按时间排序。示例:
之前
之后
编辑:抱歉,我要从“ 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
答案 0 :(得分:0)
不确定文件重命名是您的期望之一。至少不需要排序文件名。
您只能通过使用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
告诉要基于第5个字段的偏移量为4个字符的排序。没有停止字段,因为这是文件名的结尾。
-k3.1,3.4
选项基于从偏移量1到4的第三个字段进行排序。
相同的原则也适用于其他-k
选项。
在您的示例中,月份字段只有1位数字。如果您的文件中的月份用2位数字编码,则可能要用0填充所有月份的文件名。可以通过在此printf
的{{1}}语句中添加<(... | sed 's/-0\?\([0-9]\)/-0\1/')
来更改-k 2.1,2.1
。