你可能已经知道,’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
例如,以递归方式定位当前文件夹中的所有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
示例:
$ find . ! -name ‘*.mp3’ -type f | xargs cp -t Misc/
因此,除了”.mp3 “文件外,所有递归找到的文件都被复制到了 “Misc “文件夹中。
在本文中,我们学习了如何在Linux服务器中递归复制文件,同时排除特定扩展名的文件。此外,还可以看看如何递归复制特定扩展名的文件。