Text-Processing
查找/檢測文件名組
在 fs 我有如下文件:
PREFIX_GROUPNAME_OTHERNAMES[.txt|.*]
例如:
A_ABC_A.txt A_ABC_B.txt A_ABC_C.txt A_XYZ_A.txt A_XYZ_B.txt A_XYZ_C.txt
對於一些進一步的任務,我想獲得組名。
$# command i'm looking for result: > ABC XYZ
我知道名稱結構而不是組名。
想法(但似乎非常昂貴!(在大型列表中):
- 掃描所有文件
- 拆分名稱,按組名創建列表
- 返回組
find 和 awk 也許 tr 似乎是我在這裡找到解決方案時正在尋找的東西
編輯:
這給出了一個 NOT UNIQUE 列表:
find ./ -iname '*.txt' | xargs -n 1 | cut -d '_' -f 2 > ABC > ABC > ABC > XYZ > XYZ > XYZ
以下將僅使用 shell 字元串操作和標準工具
sort
,以避免解析ls
or的輸出find
,強烈建議不要這樣做:for f in *.*; do gr=${f#*_};gr=${gr%_*}; printf "%s\n" "$gr"; done | sort -u
在您的情況下,它應該準確輸出
ABC XYZ
解釋:
- 我們遍歷所有匹配的文件名
*.*
(應該是一個“最低限度全面”的模式來捕捉你所說的所有文件名)- 通過 shell 字元串操作,我們首先刪除到 first 的所有內容,
_
然後在第二步中刪除從 last 開始的所有內容_
。- 我們通過輸出結果
printf
(正如 Stéphane Chazelas 所指出的,您的 shell 不太可能缺少該命令)結果輸出還不是唯一的。為了刪除重複項,我們將輸出通過
sort -u
.請注意,如果 - 正如您所說 - 您有很多與此模式匹配的文件,您的
for
循環參數列表可能會超出 shell 的內部限制。此外,雖然這種方法避免了許多與文件名中的特殊字元相關的陷阱,但使用printf
andsort
意味著如果文件名包含換行符(這是許多文件系統上文件名的有效字元),它將失敗。