web-dev-qa-db-ja.com

Unixでfindを使用してベースファイル名を印刷するにはどうすればよいですか?

Unixでfindを使用してベースファイル名を印刷しようとしています。私が使用しているコマンドがファイル名を単純に印刷するためにこれはこれです

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

フルパス修飾パス名を出力します。ただし、ベースファイル名のみが必要です。だから私は次のコマンドを試してきました

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

しかし、エラーが発生して表示されます

find: incomplete statement

助けてください。

2
recmach

一次式を終了するための;文字がありません( 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 -- {} +
7
cuonglm

-execを終了するために、コマンドの最後にセミコロンがありません。

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

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

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

あなたは去った\;

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

awkも追加します:

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