Text-Processing

查找/檢測文件名組

  • November 5, 2021

在 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,以避免解析lsor的輸出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 的內部限制。此外,雖然這種方法避免了許多與文件名中的特殊字元相關的陷阱,但使用printfandsort意味著如果文件名包含換行符(這是許多文件系統上文件名的有效字元),它將失敗。

引用自:https://unix.stackexchange.com/questions/676311