9

find の exec 内でサブコマンドを実行するにはどうすればよいですか? たとえば、フルパスからのみファイル名を取得して印刷したい場合は、

find ./ -name "*.csv" -exec echo $(basename {}) \;

ここで、echo は子コマンド basename の親コマンドです。

しかし、結果はこれと同じです。

find ./ -name "*.csv" -exec echo {} \;

私は何をすべきか ?

4

3 に答える 3

17

これはあなたが探しているものです:

find . -name "*.csv" -exec sh -c 'echo $(basename "$1")' sh {}  \;
于 2012-12-12T07:27:31.393 に答える
0

いつものように、シェルを呼び出して実行します。

find ... -exec bash -c "... $1 ..." subshell {} \;
于 2012-12-12T06:10:30.900 に答える
0

@Ignacio'sは厳密に正しいですが、POSIX標準シェルを提案するのではなく、特定のシェルに偏っています....

ただし、フィルターを使用すると、はるかに効率的に実行できます。つまり、印刷しようとしている各パス名を変換する方法を見つけようとしていますfindが、それにより、 find は、一致するすべてのファイル名に対してシェルプロセスをフォークします!

より効率的にするには、代わりに、生成される可能性のあるパス名のリストを、表示したい形式に変換する方法を見つけ、findそれを 1 つの追加プロセスだけで行うようにしてください。

たとえば、表示したいのが各パス名のベース名 (つまり、最終的なファイル名コンポーネント) だけである場合は、(比較的) 単純なコマンドを使用して簡単に実行できます。このコマンドを使用して、出力をsedパイプして目的のファイル名のリストを生成できます。find

sed '/^[^/]*$/p;s/.*\/\([^/]*\)$/\1/p'
于 2012-12-12T06:35:16.330 に答える