linux - 如何在 BASH 中按名称排序然后修改日期

标签 linux bash sorting unix

假设我有一个包含 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/

相关文章:

c++ - 等待文件存在且不被其他人占用

Ruby:如何使我的程序陷入信号并从信号中正确退出?

linux - 在 Vagrant 上配置期间如何以另一个用户身份执行命令?

linux - Bash 如果失败返回上一个命令

java - 如何通过从java给出变量来在bash脚本中执行git命令?

algorithm - 冒泡排序伪代码 n-1 是什么意思?

java - 按时间和权重对记录进行排序

linux - 将多播路由添加到 linux 多播路由表

regex - 正则表达式 [A-Za-z] 似乎不包括字母 W 和 w

java - 有没有一种简单的方法可以在 Java 中按字母顺序排列字符串枚举?