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 が解決策を見つけるときに探しているようです。
編集する:
これは一意でないリストを提供します。
find ./ -iname '*.txt' | xargs -n 1 | cut -d '_' -f 2
> ABC
> ABC
> ABC
> XYZ
> XYZ
> XYZ
ベストアンサー1
以下は、シェル文字列操作と標準ツールのみを使用してsort
防止します。出力の解析ls
またはfind
、次のことを行わないことをお勧めします。
for f in *.*; do gr=${f#*_};gr=${gr%_*}; printf "%s\n" "$gr"; done | sort -u
あなたの場合は正確に出力する必要があります。
ABC
XYZ
説明する:
- 一致するすべてのファイル名を繰り返します
*.*
(言うように、すべてのファイル名をキャプチャするには「最小包括的」パターンでなければなりません)。 - シェル文字列操作を使用すると、最初の項目より前のすべての項目が削除され、次の2番目のステップ
_
では最後の項目から始まるすべての項目が削除されます_
。 - 次の方法で結果を出力します
printf
。 (Stéphane Chazelasが指摘したように、シェルにこのコマンドが欠けている可能性はほとんどありません。)
最終出力は唯一の出力ではありません。重複を排除するために出力をパイプしますsort -u
。
ノートあなたが言ったように、このパターンに一致するファイルが多い場合、for
ループパラメータのリストがシェルの内部制限を超える可能性があります。また、この方法はファイル名の特殊文字に関連する多くのトラップを防ぎますが、ファイル名に改行文字(多くのファイルシステムのファイル名に有効な文字)が含まれている場合、この方法は失敗することを意味しますprintf
。sort