同步

同步

我认为这个问题最好用一个例子来提出。

/home
   test1.txt
   test2.txt
   /home/my-folder
      test3.txt
      test4.txt
  1. test1.txttest2.txtmy-folder文件夹在里面/home
  2. test3.txttext4.txt在里面/home/my-folder

我想复制文件夹的所有内容/home,但排除其中的 2 个文件(test3.txttest4.txtmy-folder

我该如何使用 来做到这一点cp

我知道这是可能的,rsync因为我刚刚尝试过,但有时rsync未安装在服务器中,并且我无权安装软件。

答案1

您可以使用 和find(1)来做到这一点cpio(1)

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

答案2

您无法cp单独完成此操作,除非列出要复制的文件。制作部分副本超出了cp的能力范围。

Rsync 是完成这项工作的明显工具,而且应用非常广泛。

如果你只有 POSIX 工具,你可以使用帕克斯。您可以通过将文件路径重写为空字符串来省略文件。

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

如果您只有一个缺少 的最小 Linux 服务器pax,请查看其传统的等效项cpiotar是否可用。看lcd047 的回答举个cpio例子。使用GNU tar,你可以做到

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

答案3

同步

我需要这样的东西并在论坛上进行了一些研究。正如 Gilles 提到的,我发现最好的方法是使用 RSYNC。我喜欢它的两点:

  • 您可以使用 .gitignore 等外部文件作为输入来排除您不想复制的文件和文件夹。
  • 当您需要对同一源目录重复相同的备份(复制)时(不需要复制现有文件或文件夹),这很高效,正如我将在下面的示例 4 中提到的。

示例 1:排除特定文件:

rsync -a --exclude 'file.txt' originalDirectory/ backupDirectory/

示例 2:排除特定文件夹(例如名为 dirName):

rsync -a --exclude 'dirName' originalDirectory/ backupDirectory/

示例 3:排除多个文件和文件夹:

rsync -a --exclude={'file1.txt', 'file2.json','dir1/*','dir2'} originalDirectory/ backupDirectory/

示例 4:排除多个文件和文件夹:

rsync -a --exclude-from='exclude.txt' originalDirectory/ backupDirectory/

排除.txt包含以下内容:

file1.txt
file2.json
file3.pdf
dir1
dir2
*.png

答案4

怎么样

cp !(my-folder) /foo

例子:

$ find . -type f
./my-folder/test4.txt
./my-folder/test3.txt
./test2.txt
./test1.txt
$ echo cp !(my-folder) /foo
cp test1.txt test2.txt /foo
$

相关内容