我想复制目录中的所有文件,但特定子目录中的某些文件除外.我注意到'cp'命令没有--exclude选项.那么,我怎样才能做到这一点?
小智 634
rsync快速简便:
rsync -av --progress sourcefolder /destinationfolder --exclude thefoldertoexclude
Run Code Online (Sandbox Code Playgroud)
您可以使用--exclude倍数.
您还可以添加thefoldertoexclude干运行以查看在执行实际操作之前将要复制的内容,如果一切正常,请--exclude从命令行中删除.
uli*_*tko 79
好吧,如果必须由每个unix-ish文件实用程序(如cp,mv,rm,tar,rsync,scp,...)执行某些文件名模式的排除,则会发生巨大的重复工作.相反,这些事情可以作为globbing的一部分完成,即通过你的shell.
链接到手册,搜索extglob.
例:
$ shopt -s extglob $ echo images/* images/004.bmp images/033.jpg images/1276338351183.jpg images/2252.png $ echo images/!(*.jpg) images/004.bmp images/2252.png
所以你只是把一个模式放在里面!(),它否定了匹配.模式可以是任意复杂的,从单个路径的枚举开始(如Vanwaril在另一个答案中所示):!(filename1|path2|etc3)对于具有星形和字符类的正则表达式.有关详细信息,请参阅联机帮助页.
链接到手册,"文件名生成"部分.
你可以做setopt KSH_GLOB和使用类似bash的模式.要么,
% setopt EXTENDED_GLOB % echo images/* images/004.bmp images/033.jpg images/1276338351183.jpg images/2252.png % echo images/*~*.jpg images/004.bmp images/2252.png
所以x~y匹配模式x,但不包括模式y.有关详细信息,请参阅联机帮助页.
cp (string match -v '*.excluded.names' -- srcdir/*) destdir
输入cp *,点击CtrlX*,看看会发生什么.我保证这没有害处
Lin*_*een 45
为什么rsync在你能做的时候使用:
find . -type f -not -iname '*/not-from-here/*' -exec cp '{}' '/dest/{}' ';'
Run Code Online (Sandbox Code Playgroud)
这假定目标目录结构与源的目录结构相同.
sec*_*rve 23
我找到的最简单的方法,只需在括号中添加名称,即可复制除文件和文件夹之外的所有文件:
shopt -s extglob
cp -r !(Filename1 | FoldernameX | Filename2) Dest/
Run Code Online (Sandbox Code Playgroud)
小智 11
cd dotfiles
tar -c --exclude .git --exclude README . | tar -x -C ~/dotfiles2
Run Code Online (Sandbox Code Playgroud)
小智 8
rsync的
rsync -r --verbose --exclude 'exclude_pattern' ./* /to/where/
Run Code Online (Sandbox Code Playgroud)
并首先使用-n选项尝试查看将要复制的内容
只需将其暂时移动到隐藏目录中(如果需要,可以重新命名)。
mkdir .hiddendir
cp * .hiddendir -R
mv .hiddendir realdirname
Run Code Online (Sandbox Code Playgroud)
rsync实际上是相当棘手的。必须进行多次测试才能使其正常工作。
假设您想复制/var/www/html到/var/www/dev但可能由于其大小而需要排除 /var/www/html/site/video/目录。命令将是:
rsync -av --exclude 'sites/video' /var/www/html/ /var/www/dev
一些警告:
/源代码中的最后一个斜杠是必需的,否则它也会复制源目录而不是其内容并变为/var/www/dev/html/xxxx,这可能不是您想要的。所述的--exclude路径是相对直接的来源。即使你把完整的绝对路径,它也不会工作。
-v用于详细,-a用于存档模式,这意味着您需要递归并希望保留几乎所有内容。
小智 8
它相对于源目录。
这将从source/.git复制目录中排除该目录。
rsync -r --exclude '.git' source target
Run Code Online (Sandbox Code Playgroud)
我假设你正在使用bash或dash.这会有用吗?
shopt -s extglob # sets extended pattern matching options in the bash shell
cp $(ls -laR !(subdir/file1|file2|subdir2/file3)) destination
Run Code Online (Sandbox Code Playgroud)
做一个不包含您不想要的文件的ls,并将其作为cp的第一个参数
cp -rv `ls -A | grep -vE "dirToExclude|targetDir"` targetDir
Run Code Online (Sandbox Code Playgroud)
编辑:忘记排除目标路径(否则它会递归复制)。
这是对 Linus Kleen 答案的修改。他的回答对我不起作用,因为会有一个 . 添加在 cp 不喜欢的文件路径前面(该路径看起来像 source/.destination/file)。
这个命令对我有用:
find . -type f -not -path '*/exlude-path/*' -exec cp --parents '{}' '/destination/' \;
--parents 命令保留目录结构。
| 归档时间: |
|
| 查看次数: |
377224 次 |
| 最近记录: |