find、exec、cp を使用して、ディレクトリパスを維持しながら特定のファイルをコピーする

find、exec、cp を使用して、ディレクトリパスを維持しながら特定のファイルをコピーする

空のテキスト ファイルを含む次のフォルダーを設定しました。

1/a.txt
2/b.txt

ディレクトリ構造を維持しながら、txt ファイルのみを別のディレクトリにコピーしたいので、次のコマンドを試しました。

mkdir -p temp/s;
find ./ -name '*txt' -exec cp --parents '{}' ./temp/s \;

現在、現在のディレクトリから次のファイルが表示されます。

1/a.txt
2/b.txt
temp/s/1/a.txt
temp/s/2/b.txt
temp/s/temp/s/2/b.txt

最後の行が発生した理由がわかりませんtemp/s/temp/s/2/b.txt。なぜこのようなことが起こったのか、また、コマンドがtemp別のコマンド内にネストされないようにするにはどうすればよいのか、誰か説明してもらえますかtemp?

これが私が期待していた最終結果です:

1/a.txt
2/b.txt
temp/s/1/a.txt
temp/s/2/b.txt

答え1

あなたが持っている競合状態:は の検索パスtemp/s内にあるため、はファイルをリストし、生成されたは新しいファイルを追加します。findfindcp

実行中にサブディレクトリを除外する必要がありますfind:

find . -path ./temp/s -prune -o -name '*txt' -exec cp --parents '{}' ./temp/s \;

\;を に置き換えると、+生成されるプロセスが大幅に少なくなることに注意してくださいcp

関連情報