コマンド「cp」を使用してディレクトリをコピーし、その中の特定のファイル/サブディレクトリを除外する方法はありますか?
コマンド「cp」を使用してディレクトリをコピーし、その中の特定のファイル/サブディレクトリを除外する方法はありますか?
回答:
使用rsync
:
rsync -avr --exclude='path1/to/exclude' --exclude='path2/to/exclude' source destination
source
とsource/
は異なることに注意してください。末尾には、フォルダの内容をコピーするための手段スラッシュsource
にしますdestination
。末尾のスラッシュがない場合、フォルダーのソースをにコピーすることを意味しますdestination
。
または、除外するディレクトリ(またはファイル)が多数ある場合は、を使用できます--exclude-from=FILE
。ここで、FILE
は除外するファイルまたはディレクトリを含むファイルの名前です。
--exclude
次のようなワイルドカードを含めることもできます --exclude=*/.svn*
コピー元: https : //stackoverflow.com/a/2194500/749232
cp
自分自身を使用する場合:
find . -type f -not -iname '*/not-from-here/*' -exec cp '{}' '/dest/{}' ';'
これは、ターゲットディレクトリ構造がソースの構造と同じであることを前提としています。
ゲームの後期ですが、プレーンbashとcpを使用した非常に異なるソリューションがあります。一部のファイルを無視しながら、グローバルファイル仕様を使用できます。
ディレクトリにファイルが含まれていると仮定します。
$ ls *
listed1 listed2 listed3 listed4 unlisted1 unlisted2 unlisted3
GLOBIGNORE変数の使用:
$ export GLOBIGNORE='unlisted*'
$ ls *
listed1 listed2 listed3 listed4
または、より具体的な除外あり:
$ export GLOBIGNORE='unlisted1:unlisted2'
$ ls *
listed1 listed2 listed3 listed4 unlisted3
または、負の一致を使用します:
$ ls !(unlisted*)
listed1 listed2 listed3 listed4
これは、いくつかの一致しないパターンもサポートしています。
$ ls !(unlisted1|unlisted2)
listed1 listed2 listed3 listed4 unlisted3
shopt -s extglob
、拡張グロブを有効にする必要があります。また、エクスポートする必要もありません。GLOBIGNORE
現在のシェルの動作を変更するためのもので、ほとんどの子プログラムはそれを気にしません。