![find、exec、cp を使用して、ディレクトリパスを維持しながら特定のファイルをコピーする](https://rvso.com/image/747354/find%E3%80%81exec%E3%80%81cp%20%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%97%E3%81%A6%E3%80%81%E3%83%87%E3%82%A3%E3%83%AC%E3%82%AF%E3%83%88%E3%83%AA%E3%83%91%E3%82%B9%E3%82%92%E7%B6%AD%E6%8C%81%E3%81%97%E3%81%AA%E3%81%8C%E3%82%89%E7%89%B9%E5%AE%9A%E3%81%AE%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%92%E3%82%B3%E3%83%94%E3%83%BC%E3%81%99%E3%82%8B.png)
空のテキスト ファイルを含む次のフォルダーを設定しました。
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
内にあるため、はファイルをリストし、生成されたは新しいファイルを追加します。find
find
cp
実行中にサブディレクトリを除外する必要がありますfind
:
find . -path ./temp/s -prune -o -name '*txt' -exec cp --parents '{}' ./temp/s \;
\;
を に置き換えると、+
生成されるプロセスが大幅に少なくなることに注意してくださいcp
。