shell 在显示原始文件名的同时,按最后一个分隔的子字符串对目录中的文件进行排序

ktca8awb  于 2023-05-18  发布在  Shell
关注(0)|答案(3)|浏览(203)

我有一个目录,其中包含以时间戳结尾的文件。我想按名称中的时间戳顺序遍历这个目录中的文件。我在Unix的shell脚本中做这件事。

filename1_20230517_065806.txt
filename2_20230517_055806.txt
filename_3_20230517_125806.txt
file_name_4_20230517_063806.txt

我需要按以下顺序处理这个

filename2_20230517_055806.txt
file_name_4_20230517_063806.txt
filename1_20230517_065806.txt
filename_3_20230517_125806.txt

订单应该只查看文件名的时间部分。我希望这样做,但由于文件名可以有任何数量的下划线,我有困难。

for i in $(ls *.txt | sort -t'_' -k3)
do...

有没有一种方法可以让sort查看最后一个分隔的索引并按它排序?

fxnxkyjh

fxnxkyjh1#

你可以使用“rev”来反转元素,然后用前两个元素排序:

#!/bin/bash

filenames="filename1_20230517_065806.txt filename2_20230517_055806.txt filename_3_20230517_125806.txt file_name_4_20230517_063806.txt"

# Convert the filenames string into an array
IFS=' ' read -r -a files_array <<< "$filenames"

# Sort the array based on the timestamp with reversed elements
sorted_array=($(for file in "${files_array[@]}"; do
  timestamp=$(echo "$file" | rev | cut -d_ -f1,2 | rev)
  echo "$timestamp $file"
done | sort | cut -d' ' -f2))

for file in "${sorted_array[@]}"; do
  echo "$file"
done

输出看起来与预期相同:

filename2_20230517_055806.txt
file_name_4_20230517_063806.txt
filename1_20230517_065806.txt
filename_3_20230517_125806.txt
vaj7vani

vaj7vani2#

我认为您需要awk的帮助,使用临时增加数据的“技巧”,通过在每行添加所需的排序键。我还在下面的排序键中添加了日期($(NF-1))。
for i in $(ls *.txt | awk -F_ ‘{print $(NF-1) $NF “\t” $0}’ | sort | cut -f 2-) do...

hgb9j2n6

hgb9j2n63#

$ find . -type f -name "*.txt"|awk -F_ '{a[$NF]=$0} END{n=asorti(a,b); for(i=1; i<=n; i++) print a[b[i]]}'
./filename2_20230517_055806.txt
./file_name_4_20230517_063806.txt
./filename1_20230517_065806.txt
./filename_3_20230517_125806.txt

相关问题