所以我希望从任何目录运行它,~/
并让它适用于子目录。例如;
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
才有。但我确实有目录,所以也许我应该只搜索。_
_
awk
SENT_
(我只是在尝试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
解释 :
查找输出将如下所示:
<DIRNAME>/<FILENAME>|<FILENAME>
我可以按第二列进行排序,第二列
|
是分隔符用于
cut
仅保留第一列