Unixでfindを使用してベースファイル名を印刷しようとしています。私が使用しているコマンドがファイル名を単純に印刷するためにこれはこれです
find . -type f -name \*.out -print
フルパス修飾パス名を出力します。ただし、ベースファイル名のみが必要です。だから私は次のコマンドを試してきました
find . -type f -name \*.out -exec basename {}
しかし、エラーが発生して表示されます
find: incomplete statement
助けてください。
一次式を終了するための;
文字がありません( POSIX find を参照):
find . -type f -name \*.out -exec basename {} ';'
エスケープする必要がある理由、または;
はシェルリストの区切り文字であるため、引用符で囲んでください。あなたはあなたのシェルにそれを文字通り扱わせなければなりません。 \;
、';'
または";"
はすべて正常に機能します。
ただし、このソリューションでは、見つかったファイルごとにbasename
が呼び出されるため、処理が遅くなります。ファイル名に改行が含まれていない場合は、次のことができます。
find -type f -name '*.out' | sed -e '#.*/##'
GNUcoreutilsバージョン> = 8.16 を使用している場合、またはOSXを使用している場合は、 basename -a を使用できます。
find -type f -name '*.out' -exec basename -a -- {} +
-exec
を終了するために、コマンドの最後にセミコロンがありません。
find . -type f -name \*.out -exec basename {} \;
ただし、このコマンドは外部プロセスをフォークし、一致するたびにbasename
を呼び出すため、実行速度が非常に遅くなります。検索で-printf
オプションがサポートされている場合は、代わりにそれを使用することをお勧めします。
find . -type f -name \*.out -printf '%f\n'
あなたは去った\;
find . -type f -name \*.out -exec basename {} \;
awk
も追加します:
find . -type f -name \*.out -print | awk -F "/" '{print $NF}'