web-dev-qa-db-ja.com

ディレクトリとサブフォルダーをコピーし、サブフォルダー内の特定のファイルを無視するにはどうすればよいですか?

質問は例を挙げて行うのが最も良いと思います。

/home
   test1.txt
   test2.txt
   /home/my-folder
      test3.txt
      test4.txt
  1. test1.txttest2.txtmy-folderフォルダーは/home内にあります。
  2. test3.txtおよびtext4.txt/home/my-folder内にあります。

/homeフォルダーのすべての内容をコピーしますが、test3.txt内の2つのファイル(test4.txtおよびmy-folder)は除外します

cpを使用してどうすればよいですか?

rsyncを試してみたところ、可能です。ただし、サーバーにrsyncがインストールされておらず、ソフトウェアをインストールする権限がない場合があります。

4
mrjayviper

あなたはfind(1)cpio(1)でそれを行うことができます:

find /home -path './my-folder/test[34].txt' -Prune -o \( -type f -print \) | \
    cpio -pdamv /some/other/dir
6
lcd047

これをcpだけで行うことはできません。コピーするファイルをリストした短いfです。部分的なコピーの作成は、cpの機能を超えています。

Rsyncは、このジョブの明らかなツールであり、非常に広く使用されています。

POSIXツールしかない場合は、 pax を使用できます。パスを空の文字列に書き換えることでファイルを省略できます。

cd /home && pax -rw -pe -s'~^\./my-folder/test[34]\.txt$~~' . /path/to/destination

Paxが不足している最小限のLinuxサーバーしかない場合は、従来の同等のcpioまたはtarが利用可能かどうかを確認してください。 cpioの例については lcd047の回答 を参照してください。 GNU tarを使用すると、次のことができます

mkdir /path/to/destination
tar c -C /home --exclude='./my-folder/test[34].txt' | tar x -C /path/to/destination