我认为这个问题最好用一个例子来提出。
/home
test1.txt
test2.txt
/home/my-folder
test3.txt
test4.txt
test1.txt
,test2.txt
和my-folder
文件夹在里面/home
。test3.txt
并text4.txt
在里面/home/my-folder
。
我想复制文件夹的所有内容/home
,但排除其中的 2 个文件(test3.txt
和test4.txt
)my-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
,请查看其传统的等效项cpio
或tar
是否可用。看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
$