How to use 'cp' command to exclude a specific directory?
我想复制一个目录中的所有文件,除了特定子目录中的一些文件。我注意到"cp"命令没有--exclude选项。那么,我怎样才能做到这一点呢?
rsync快速简单:
1 | rsync -av --progress sourcefolder /destinationfolder --exclude thefoldertoexclude |
您可以使用
1 | rsync -av --progress sourcefolder /destinationfolder --exclude thefoldertoexclude --exclude anotherfoldertoexclude |
注意,
此外,您还可以添加
好吧,如果每个unix-ish文件实用程序(如cp、mv、rm、tar、rsync、scp等)都必须执行某些文件名模式的排除,就会出现大量的重复工作。相反,这些事情可以作为环球旅行的一部分,也就是说,通过你的外壳。
猛击链接到手册,搜索extglob。
例子:
1 2 3 4 5 | $ 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 |
所以你只要在
链接到手册的"文件名生成"部分。
您可以执行
1 2 3 4 5 | % 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 |
因此,
鱼壳有一个更漂亮的答案:
1 | ?? cp (string match -v '*.excluded.names' -- srcdir/*) destdir |
奖金奖励小费
键入
如果可以,为什么要使用
1 | find . -type f -not -iname '*/not-from-here/*' -exec cp '{}' '/dest/{}' ';' |
这假定目标目录结构与源目录结构相同。
1 | cp -r `ls -A | grep -v"c"` $HOME/ |
我找到的最简单的方法是,只需在括号中添加文件和文件夹的名称,就可以复制所有文件(不包括文件和文件夹):
1 2 | shopt -s extglob cp -r !(Filename1 | FoldernameX | Filename2) Dest/ |
扩展MVD的评论,这对我很有用。
1 2 | cd dotfiles tar -c --exclude .git --exclude README . | tar -x -C ~/dotfiles2 |
远程同步
1 | rsync -r --verbose --exclude 'exclude_pattern' ./* /to/where/ |
首先用-n选项尝试,看看要复制什么
我猜你用的是bash或dash。这行吗?
1 2 | shopt -s extglob # sets extended pattern matching options in the bash shell cp $(ls -laR !(subdir/file1|file2|subdir2/file3)) destination |
执行ls排除不需要的文件,并将其用作cp的第一个参数
它是相对于的源目录。这将被排除从copied
1 | rsync -r --exclude '.git' source target |
另一个更简单的选项是安装和使用rsync,它有--excludedir选项,可以用于本地和远程文件。
这是对Linus Kleen答案的修改。他的回答对我不起作用,因为会有一个。在cp不喜欢的文件路径前面添加(路径看起来像source/.destination/file)。
这个命令对我有效:
--parents命令保留目录结构。
只是暂时移动到一个隐藏的目录中(如果需要的话,可以在后面重命名)。
1 2 3 | mkdir .hiddendir cp * .hiddendir -R mv .hiddendir realdirname |
1 2 3 | mv tobecopied/tobeexcluded . cp -r tobecopied dest/ mv tobeexcluded tobecopied/ |
我使用"do while"循环读取find命令的输出。在这个例子中,我匹配(而不是排除)某些模式,因为我想要的模式匹配数量比我不想要的要少。您可以使用-iname标志前面的-not反转逻辑:
1 | find . -type f -iname"*.flac" -o -print0 -iname"*.mp3" -print0 -o -iname"*.wav" -print0 -o -iname"*.aac" -print0 -o -iname"*.wma" -print0 | while read -d $'\0' file; do cp -ruv"$file""/media/wd/network_sync/music/$file"; done |
我使用上面的内容复制服务器上比安装在/media/wd上的Western Digital TV Live Hub上的文件更新的所有音乐类型文件。我使用上面的内容是因为我有很多要排除的DVD文件、MPEG等,并且由于某些原因,rsync看起来像是在复制,但是在我查看wd设备之后,尽管在使用此命令进行rsync期间没有错误,但这些文件仍然不存在:
1 | rsync -av --progress --exclude=*.VOB --exclude=*.avi --exclude=*.mkv --exclude=*.ts --exclude=*.mpg --exclude=*.iso --exclude=*ar --exclude=*.vob --exclude=*.BUP --exclude=*.cdi --exclude=*.ISO --exclude=*.shn --exclude=*.MPG --exclude=*.AVI --exclude=*.DAT --exclude=*.img --exclude=*.nrg --exclude=*.cdr --exclude=*.bin --exclude=*.MOV --exclude=*.goutputs* --exclude=*.flv --exclude=*.mov --exclude=*.m2ts --exclude=*.cdg --exclude=*.IFO --exclude=*.asf --exclude=*.ite /media/2TB\ Data/data/music/* /media/wd/network_sync/music/ |
一种方法是使用
让我们说你想复制到
一些警告:
‘
1 | cp -rv `ls -A | grep -vE"dirToExclude|targetDir"` targetDir |
编辑:也忘记排除目标路径(否则它将递归复制)。
1 | ls -I"filename1" -I"filename2" | xargs cp -rf -t destdir |
第一部分