たとえば、* .txtという名前のファイルを含むすべてのディレクトリを探したいとします。ただし、出力に重複を含めないでください。どうすればいいですか?
答え1
努力する:
find . -type f -name "*.txt" -printf '%h\n' | sort | uniq
仕組みは次のとおりです。
find . -type f -name "*.txt" -printf '%h\n'
- ()で終わるすべてのファイルを見つけて、そのディレクトリ*.txt
(%h
)と改行文字を印刷します。
| sort
- ディレクトリの並べ替え
| uniq
- 重複排除
答え2
POSIX互換適用するコードどのファイル名:
find . -name '*.txt' -printf '%h\0' | tr '\0\n' '\n\0' | sort -u | tr '\0\n' '\n\0'
答え3
問題は、ディレクトリ名に改行文字を含めることができるため、findの出力がNULで終わる必要があることです。ソートされた結果について読み取ることができる出力パイプラインを持つには、次のようにしますtr
。
find . -name "*.txt" -printf '%h\0' | sort -zu | tr '\0' '\n'
ディレクトリ名の改行は、./
ディレクトリの改行で始まらない場合は、次の行を確認することで確認できます。
答え4
find
GNUとbashの使用
find . -type d -exec bash -c \
$'for f; do find \"$f\" -maxdepth 1 -type f -name \'*.txt\' -printf \'%h\\n\' -quit; done'\
_ {} +