有些时候,我们在做文件/目录批量拷贝时,经常需要排除掉一些文件/目录,但是cp命令并没有提供类似的参数,这就需要我们自己去组合命令来实现这些功能了。
其实方法还是很多的,linux的命令很多且组合灵活,下面我列出几个博主经常使用的命令:
1. ls + xargs
先说命令:
ls x1/ | grep -v x2 | xargs -i cp -r x1/{} x3/ //x1为源路径, x2为欲排除的文件/目录,x3为目标路径
下面我解释一下上面命令的含义:
ls x1/ :将x1目录下的文件/目录全部列出来(不包含隐藏的,否则要加-a)| :管道,将前面命令输出的内容作为输入参数传给后面的命令grep -v x2 :排除x1目录下的x2文件/目录 (-v的作用是排除)xargs -i :xargs实现将管道传递过来的stdin进行处理然后传递到命令的参数位置上;-i: 如果不使用-i,则默认是将分割处理后的结果整体传递到命令的最尾部; 但是有时候需要传递到多个位置,不使用-i就不知道传递到哪个位置了使用xargs -i时以大括号{}作为替换符号,传递的时候看到{}就将结果替换,可以将{}放在任意需要传递的参数位置上。如果多个地方使用{}就实现了多个传递
案例
jimmy@Jimmy-Desktop:~$ ll //当前目录下有4个文件 total 4 drwxrwxrwx 1 jimmy jimmy 512 May 9 15:20 alsa/ drwxrwxrwx 1 jimmy jimmy 512 Jun 13 21:12 code/ drwxr-xr-x 1 jimmy jimmy 512 Apr 20 16:27 conf/ -rwxr-xr-x 1 jimmy jimmy 1461 Apr 20 16:27 sh-ota.sh* jimmy@Jimmy-Desktop:~$ mkdir test //创建一个test目录 jimmy@Jimmy-Desktop:~$ ll test/ total 0 jimmy@Jimmy-Desktop:~$ ll code/ //该目录作为源目录,有三个子目录 total 0 drwxrwxrwx 1 jimmy jimmy 512 Jun 13 11:05 cpp/