アプリケーション固有の理由から、親ディレクトリ全体をサブディレクトリにコピーする必要があります。例えば、
cp -r ../ tmp/
これの問題は、tmp/の内容を繰り返し再帰的にコピーしながら、無限ループに陥るということです。
この問題を解決するには、ディレクトリを圧縮してtmpに抽出するなど、いくつかありますが、特にエレガントな/ unixyソリューションがあるかどうか疑問に思います。
(注:私はApple OS / Xを使用しています。)
ベストアンサー1
親ディレクトリから起動する場合は、find
GNUを使用してこれを実行できますcp
。現在存在するディレクトリ(インクルードディレクトリtmp
)の名前が指定されており、folder
そのディレクトリが空であると仮定tmp
すると、次のことを実行できます。
cd ..
find . -path ./folder/tmp -prune -o -type f -exec cp --parents -t folder/tmp {} +
これはfindに以下のすべての項目.
(前の項目..
)をリストするように要求します。一致する場合を除き./folder/tmp
、そうでない場合はファイルの場合はcp
オプションに渡します(ソース階層を再構築するように指示します--parents
)。cp
tmp
まだコピーする必要があるファイルがすでに存在する場合、次のバリエーションはUnix-yが少し少なくなります。moreutils
' sponge
)しかし、以下をスキップしないでくださいtmp
。
cd ..
find . -type f -print0 | sponge | xargs -0 cp --parents -t folder/tmp
sponge
コピーするファイルのリストを別の場所に保存すると、これを防ぐことができます(ただし、それを行うとあまりエレガントになります)。
cd ..
find . -type f -print0 > /tmp/filelist
xargs -0 cp --parents -t folder/tmp < /tmp/filelist
rm /tmp/filelist
cp
以下を使用すると、GNUの要件を回避できますcpio
。
cd ..
find . -type f -print0 > /tmp/filelist
cpio -pmd0 folder/tmp < /tmp/filelist
rm /tmp/filelist
または
cd ..
find . -type f -print0 | sponge | cpio -pmd0 folder/tmp
空の場合は、tmp
次の要件を回避することもできますmoreutils
。
cd ..
find . -path ./folder/tmp -prune -o -type f -print0 | cpio -pmd0 folder/tmp