你可能已经知道,\'cp\'是Linux服务器中复制文件和目录的命令行程序。\'cp\'最简单、最常用的用法如下:
$ cp file1 file2 file3... fileN target_folder/
请注意,以上命令适用于文件以及“空”文件夹。它不适用于包含某些内容(文件或子文件夹)的文件夹。
要复制这样的文件夹,我们可以指定\'-r\'(递归)标识。
$ cp -r folder1 / folder2 / file1 file2 target_folder /
递归复制意味着复制文件夹下面的整个文件夹结构,即子文件夹和其中的文件,子文件夹内的子文件夹和其中的文件等。
这样就会复制所有的文件,而在\'cp\'命令内,没有办法根据某些参数来排除部分文件。例如,用户可能希望递归复制所有文件,除了子文件夹中的MP3(音频)文件之外,一直往下复制层次结构。
查找除特定文件扩展名以外的所有文件
为了达到这个目的,我们使用find命令,这是一个命令工具,简单来说就是根据文件或文件夹的参数:文件名、扩展名、大小等来搜索Linux中的文件和文件夹。
同理,在find命令中也有通过指定哪些文件应该被排除的方式来搜索文件。使用find定位特定扩展名的文件的语法是。
$ find -name \'*.\'
例如,以递归方式定位当前文件夹中的所有MP3文件。
$ find . -name \"*.mp3\"
现在,要找到文件夹和子文件夹中的所有文件,除了MP3文件,使用find的 \"否定 \"操作符。
$ find . ! -name \"*.mp3\"
我们可以看到,现在除了MP3文件之外,所有的东西都被显示出来了,但是我们只想显示文件,因为这个输出以后会输入到\'cp\'。然而,我们只想显示文件,因为这个输出将在以后被输入到\'cp\'。现在,它同时显示文件和文件夹(例如\'temp1/\'),这将导致相同文件的重复拷贝。
要从输出中删除文件夹,只需使用参数\'-type f\'。这里\'f\'代表一个文件。
$ find . -name \'*.mp3\' -type f(f)
这样,我们现在只有递归获得的文件在\'test\'文件夹中。现在,我们可以继续将这个输出用管道传送到\'cp\'命令中。
递归复制文件时排除特定的文件扩展名
为此,我们使用\'xargs\'命令使\'cp\'将\'find\'的输出作为参数。另外,我们使用\'-t\'标识来指定目标目录,如果没有这个标识,程序就会将\'find\'的输出视为目标目录。
$ find ! -name \'*.\' -type f | xargs cp -t
示例:
$ find . ! -name \'*.mp3\' -type f | xargs cp -t Misc/
因此,除了\".mp3 \"文件外,所有递归找到的文件都被复制到了 \"Misc \"文件夹中。
在本文中,我们学习了如何在Linux服务器中递归复制文件,同时排除特定扩展名的文件。此外,还可以看看如何递归复制特定扩展名的文件。