Unixでfindを使用してデフォルトのファイル名を印刷するには?

Unixでfindを使用してデフォルトのファイル名を印刷するには?

私はデフォルトのファイル名を印刷するためにUnixでfindを使用しようとしました。単純にファイル名を印刷するために私が使用したコマンドは次のとおりです。

find . -type f -name \*.out -print

フルパスに限定されたパス名を印刷します。しかし、私はデフォルトのファイル名だけが欲しいです。だから私は次のコマンドを試しました。

find . -type f -name \*.out -exec basename {}

ただし、エラーが発生して表示されます。

find: incomplete statement

この問題を克服するのに役立ちます。

答え1

;基本式を終了する文字がありません(参照:POSIX照会):

find . -type f -name \*.out -exec basename {} ';'

エスケープするか引用する必要があるのは、;シェルリストの区切り文字です。シェルが文字通り処理するようにしてください。\;';'または";"すべてが大丈夫です。

ただし、このソリューションは見つかったすべてのファイルを呼び出すため、basename遅くなります。ファイル名に改行文字が含まれていない場合は、次のことができます。

find . -type f -name '*.out' | sed -e 's#.*/##'

お持ちの場合GNU coreutils バージョン >= 8.16、またはOSXを使用している場合は、次のものを使用できます。デフォルト名-a:

find . -type f -name '*.out' -exec basename -a -- {} +

答え2

終了コマンドの最後にセミコロンがありません-exec

find . -type f -name \*.out -exec basename {} \;

ただし、コマンドは外部プロセスをフォークし、basename一致するたびに呼び出すため、非常に遅く実行されます。検索結果がこの-printfオプションをサポートしている場合は、そのオプションを使用できます。

find . -type f -name \*.out -printf '%f\n'

答え3

あなたは左\;

 find . -type f -name \*.out -exec basename {} \;

ファイルパスに改行文字が含まれていない場合は、次のものを使用することもできますawk

find . -type f -name \*.out -print | awk -F "/" '{print $NF}'

関連情報