find の exec 内でサブコマンドを実行するにはどうすればよいですか? たとえば、フルパスからのみファイル名を取得して印刷したい場合は、
find ./ -name "*.csv" -exec echo $(basename {}) \;
ここで、echo は子コマンド basename の親コマンドです。
しかし、結果はこれと同じです。
find ./ -name "*.csv" -exec echo {} \;
私は何をすべきか ?
find の exec 内でサブコマンドを実行するにはどうすればよいですか? たとえば、フルパスからのみファイル名を取得して印刷したい場合は、
find ./ -name "*.csv" -exec echo $(basename {}) \;
ここで、echo は子コマンド basename の親コマンドです。
しかし、結果はこれと同じです。
find ./ -name "*.csv" -exec echo {} \;
私は何をすべきか ?
これはあなたが探しているものです:
find . -name "*.csv" -exec sh -c 'echo $(basename "$1")' sh {} \;
いつものように、シェルを呼び出して実行します。
find ... -exec bash -c "... $1 ..." subshell {} \;
@Ignacio'sは厳密に正しいですが、POSIX標準シェルを提案するのではなく、特定のシェルに偏っています....
ただし、フィルターを使用すると、はるかに効率的に実行できます。つまり、印刷しようとしている各パス名を変換する方法を見つけようとしていますfind
が、それにより、 find は、一致するすべてのファイル名に対してシェルプロセスをフォークします!
より効率的にするには、代わりに、生成される可能性のあるパス名のリストを、表示したい形式に変換する方法を見つけ、find
それを 1 つの追加プロセスだけで行うようにしてください。
たとえば、表示したいのが各パス名のベース名 (つまり、最終的なファイル名コンポーネント) だけである場合は、(比較的) 単純なコマンドを使用して簡単に実行できます。このコマンドを使用して、出力をsed
パイプして目的のファイル名のリストを生成できます。find
sed '/^[^/]*$/p;s/.*\/\([^/]*\)$/\1/p'