我想复制目录中的所有文件,但特定子目录中的某些文件除外。我注意到'cp'命令没有--exclude选项。那么,我该如何实现呢?
tar -c | tar -x
?
我想复制目录中的所有文件,但特定子目录中的某些文件除外。我注意到'cp'命令没有--exclude选项。那么,我该如何实现呢?
tar -c | tar -x
?
Answers:
rsync快速简便:
rsync -av --progress sourcefolder /destinationfolder --exclude thefoldertoexclude
您可以使用--exclude
多次。
rsync -av --progress sourcefolder /destinationfolder --exclude thefoldertoexclude --exclude anotherfoldertoexclude
请注意,option thefoldertoexclude
之后的dir --exclude
相对于sourcefolder
,即sourcefolder/thefoldertoexclude
。
您也可以添加-n
空运行以查看执行实际操作之前将复制的内容,如果一切正常,请-n
从命令行中删除。
--exclude
thefoldertoexclude
相对于sourcefolder
当前工作目录还是相对于当前工作目录?谢谢
rsync -av --progress --exclude="thefoldertoexclude" sourcefolder /destinationfolder
-无论如何都要为rsync而不是find投票,因为您可以轻松地为源使用绝对路径,而在find中则很麻烦,因为它{}
在dst中使用了。
$ rsync user@example.com:/var/www/mypage /var/www/mylocalpage/
或从本地到远程$ rsync /var/www/mylocalpage/ user@example.com:/var/www/mypage
好吧,如果每个unix-ish文件实用程序(例如cp,mv,rm,tar,rsync,scp等)都必须执行某些文件名模式的排除,则将发生巨大的重复劳动。相反,这些事情可以作为globlob的一部分来完成,即通过您的shell。
man 1 bash
,/ extglob。
例:
$ shopt -s extglob $ echo图片/ * 图片/004.bmp图片/033.jpg图片/1276338351183.jpg图片/2252.png $ echo images /!(*。jpg) images / 004.bmp images / 2252.png
因此,您只需要在其中放置一个模式!()
,它就会使匹配无效。这种模式可以是任意复杂的,从枚举单个路径(如Vanwaril在另一个答案中所示)开始:!(filename1|path2|etc3)
到带有星号和字符类的正则表达式一样的东西。有关详细信息,请参见手册页。
man 1 zshexpn
,/ 文件名生成。
您可以做setopt KSH_GLOB
和使用类似bash的模式。要么,
%setopt EXTENDED_GLOB 回声图像百分比/ * 图片/004.bmp图片/033.jpg图片/1276338351183.jpg图片/2252.png %回声图像/*~*.jpg images / 004.bmp images / 2252.png
因此x~y
匹配模式x
,但不包括模式y
。同样,有关完整详细信息,请参见联机帮助页。
🐟cp(字符串匹配-v'* .excluded.names'-srcdir / *)destdir
键入cp *
,点击,CtrlX*然后看看会发生什么。我保证这不是有害的
zsh
虽然可以。
setopt -u extglob
。
rsync
何时可以使用,为什么使用:
find . -type f -not -iname '*/not-from-here/*' -exec cp '{}' '/dest/{}' ';'
这假定目标目录结构与源目录的结构相同。
-path
参数来测试路径层次结构,而不是-iname
find . -type f -not -path '*/not-from-here/*' -exec cp '{}' '/dest/{}' \;
rsync
呢?因为它可能不存在于系统中!而find
,cp
总是在他们的位置上。还是您是从安装2gig东西来做简单事情的家伙中选出来的?
cp -r `ls -A | grep -v "c"` $HOME/
# $1 = source path # $2 = destination path # $3 = filter copy_from_source_to_destination_except_filter() { cp -r $(ls -A $1 | grep -v -w $3 | awk -v path=$1 '{printf "%s/%s ", path, $1}') $2 }
我找到的最简单的方法是,只需在括号中添加文件和文件夹的名称,即可复制除文件和文件夹之外的所有文件:
shopt -s extglob
cp -r !(Filename1 | FoldernameX | Filename2) Dest/
-bash: !: event not found
我假设您正在使用bash或破折号。这行得通吗?
shopt -s extglob # sets extended pattern matching options in the bash shell
cp $(ls -laR !(subdir/file1|file2|subdir2/file3)) destination
进行ls排除不需要的文件,并将其用作cp的第一个参数
ls
而只需执行cp !(file1|file1) dest
。
cp $(ls folder/!exclude_folder0|exclude_folder1)) dest
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
用于存档模式,这意味着您需要递归并希望保留几乎所有内容。
cp -rv `ls -A | grep -vE "dirToExclude|targetDir"` targetDir
编辑:忘记也排除目标路径(否则它将递归复制)。
我使用“ do while”循环来读取find命令的输出。在此示例中,我要匹配(而不是排除)某些模式,因为我想要的模式匹配数量比我不想要的要少得多。您可以在-iname标志前面使用-not来反转逻辑:
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等要排除的AND,因为某种原因rsync看起来像是正在复制,但是在看wd设备后,尽管没有,但文件不存在使用此命令在rsync期间出错:
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/
cp -r ls -A | grep -v "Excluded_File_or_folder"
../$target_location -v