web-dev-qa-db-ja.com

特定のファイルのコピーを除外するcpコマンド

コマンド「cp」を使用してディレクトリをコピーし、その中の特定のファイル/サブディレクトリを除外する方法はありますか?

30
Stephen Jacob

rsyncを使用します。

rsync -av --exclude='path1/to/exclude' --exclude='path2/to/exclude' source destination

sourcesource/の使用は異なることに注意してください。末尾のスラッシュは、フォルダー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/{}' ';'

これは、ターゲットのディレクトリ構造がソースのディレクトリ構造と同じであることを前提としています。

コピー元:https://stackoverflow.com/a/4586025/749232

53
saji89

ゲームの後期ですが、プレーン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
3
xenoid