xargs内にネストされたコマンド

xargs内にネストされたコマンド

ファイルフォルダフォルダがあります。すべてのファイルを親ファイルにコピーしようとしています。次のコマンドはdirname "{}"findコマンドの前に実行されるため、機能しません。何ができますか?

find . -name "*" -type f | xargs -I "{}" cp "{}" `dirname "{}"`

答え1

現在の作業ディレクトリからディレクトリツリーの下のすべてのファイルを各ファイルの親ディレクトリに移動するには、breakまたはを実行xargsする必要さえありません。dirnamefind

$ tree
.
+--- dir1
|   +--- somefile
+--- dir2
|   +--- someotherfile
$ find . -type f -execdir mv "{}" ../ \;
$ tree
.
+--- dir1
+--- dir2
+--- somefile
+--- someotherfile

execdirforオプションは、find一致する各ファイルを含むディレクトリで指定されたコマンドを実行します。

答え2

DopeGhotiのXY問題を解決することに加えて、実際の問題に対する答えを提供したいと思います。 IMHOが知っておくと良い点は次のとおりです。 cp コマンドを別のシェルにまとめます。

find . -type f | xargs -I "{}" sh -c 'cp "{}" `dirname "{}"`'

これはうまくいかないため(cpコマンドはファイルをすでに存在するディレクトリにコピーしようとするので、次のように/..を追加する必要があります。

find . -type f | xargs -I "{}" sh -c 'cp "{}" `dirname "{}"`/..'

関連情報