オンラインでいくつかの答えを確認しましたが、コマンドにパラメータがあると機能しません-name
(おそらく私が何か間違っているかどうかはわかりません)。私が望むのは、ファイル名(ディレクトリ/パスではない)だけをリストすることです。より複雑にするには、ファイル名は同じですが拡張子が異なるため、およびを-name
使用して結果をフィルタリングする必要があります。-o
質問は私の提案です。または-printf
時にはbasename
正しく機能しないことがあります-name *.txt -o name *.pdf
。この問題を解決する他の方法はありますか?
私のファイルの例:
/dir1/dir2/dir3/dir4/
/file1.txt
/file1.pdf
/file1.ods ...etc.
リストごとにリストされている1つ以上の種類のファイルにのみ興味があります(-name
。
たった1つのコマンドで実行できますか?find
または、手順2で実行する必要があります(結果を一時ファイルに保存してから一時ファイルからディレクトリをフィルタリング/削除する)。私が達成したいことの結果は、各行にファイル名を持つテキストファイルです。
file1.txt
file1.pdf
file1.ods
file2.txt
file2.pdf
etc.
私が使用するコマンドは
find /dir1/dir2/dir3/dir4/ -type f -name '*.txt' -o -name '*.pdf' -o -name '*.ods' -printf "%f\n"
私はGNU Findを使用しています。
修正する
\(...\)
αГsнιιが私に思い出させてくれるようにを入れなければならないことが判明しました。
ベストアンサー1
論理ORパターンで複数の式を使用する場合は、その-o
式をすべて囲む必要があります\( ... \)
。それ以外の場合、最後の式の結果は常に尊重され、-printf '%f\n'
すべての先行ディレクトリが削除されたファイル名のみを印刷するために使用されます。
find . -type f \( -name '*.pdf' -o -name '*.txt' \) -printf '%f\n'
バラよりman find
下にオペレーター次のセクションに関して( expr )
:
オペレーター
...(expr)
優先順位を強制します。括弧はシェルに特別なので、通常は引用符で囲む必要があります。
したがって\( ... \)
、または'(' ... ')'
(括弧の前と後の空白が重要です)を使用してエスケープできます。