你可能已經知道,’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服務器中遞歸復制文件,同時排除特定擴展名的文件。此外,還可以看看如何遞歸復制特定擴展名的文件。