按紧跟在 SENT_ 后面的子字符串,递归地对文件名中含有字符串“SENT_”的文件进行排序,然后显示它们。Linux

按紧跟在 SENT_ 后面的子字符串,递归地对文件名中含有字符串“SENT_”的文件进行排序,然后显示它们。Linux

所以我希望从任何目录运行它,~/并让它适用于子目录。例如;

ls ~/:

/home/me/FILES/DIR_1/DIR_a/SENT_2222_....
/home/me/FILES/DIR2/SENT_3333....
/home/me/FILES/SENT_4444__....

因此,完整路径文件名可以有多个,/也可以有_

输出将是挑选出的所有文件find,按之后的第一个数字子字符串排序SENT_,然后使用完整路径和文件名打印出来(可能打印到文件),例如。就像上面列出的目录结构一样(此数字子字符串来自于$(date +%s)文件名的附加部分。我不能使用属性)。

我确实知道不要解析输出ls

https://askubuntu.com/questions/161802/how-do-i-select-a-field-column-from-the-output-of-ls-l


https://stackoverflow.com/questions/34725005/linux-sort-files-by-part-of-name-no-delimiters

我的第一次尝试(几乎成功了,只是我无法再让它显示文件名);

find . -type f -name 'SENT*' -printf '%P\n' | awk 'BEGIN { FS="_" }; {print $2}' | sort -k1.1,1.3

我用%P去掉./开头的那个。然后我打算使用多个字段分隔符awk无法使其工作('/' 和 '_')。但第二个字段有效,因为只有文件名中$2才有。但我确实有目录,所以也许我应该只搜索。__awkSENT_

(我只是在尝试sort。)

无论如何,这只是列出排序的字段,但我不知道文件的全名(带路径)。


我的第二次尝试是

https://www.gnu.org/software/gawk/manual/html_node/Field-Separators.html

https://www.linuxquestions.org/questions/programming-9/multiple-field-seperators-in-awk-178132/

https://www.unix.com/shell-programming-and-scripting/159544-cut-awk-reverse.html

find . -type f -name 'SENT*' -printf '%P\n' | awk -F_ '{NF-=2;}1' OFS='_'

尝试反向计数以查找。但由于我无法让多个字段分隔符正常工作,并且“本地”文件名中_的 数量可能有所不同,因此并没有取得很大进展。_


我最后一次尝试寻找SENT_

https://stackoverflow.com/questions/27153582/using-awk-to-get-a-specific-string-in-line

find . -type f -name 'SENT*' -printf '%P\n' | awk -F"SENT_" '{split($2,a," ");print a[1]}' | sort -r -t_  -k1.1n

-F"SENT_"我的字段分隔符在哪里(据我所知),并且之前和之后的所有内容都被拆分成一个数组。由于我想根据_之后所有内容的第一个子字符串(现在用 分隔)进行排序,因此我使用了$2,留下一个文件名,例如3432432_xxxxx_yyyyy_....。然后我要做的就是按第一个子字符串(上面的 3432432)排序。


最后一个链接,我也尝试了其他几个未被接受的答案,例如,grep -o 'SENT_[a-z0-9]\+'然后通过管道传输到cut -d "_" -f 2 | sort -bn,但甚至排序都不起作用,更不用说重新组装回完整路径了。

IM(非常)HO,我认为后一种尝试是最好的方法,仅请求帮助。

我不知道,也许这对于“单行”来说太大了,但一个简单的功能也可以起作用......

编辑

虽然我要求立即使用上述方法,但我还尝试了另一种选择,将移到$(date +%s)前面并按这种方式排序,

shopt -s globstar
for i in **; do ni=$(echo $i | awk -F'[_.]' '{print $2"_"$4"_"$1"_"$3"."$5 }') && mv "$i" "$ni" ; done

但我认为双重__操作搞砸了。此外,遍历目录似乎不起作用。

答案1

一个办法 :

find . -type f -name 'SENT*' -printf '%P|%f\n' | \
   sort -t'|' -k2 | \
   cut -d'|'  -f 1 

解释 :

  1. 查找输出将如下所示:

    <DIRNAME>/<FILENAME>|<FILENAME>
    
  2. 我可以按第二列进行排序,第二列|是分隔符

  3. 用于cut仅保留第一列

相关内容