copy時排除某些文件或文件夾
資料來源:https://www.jianshu.com/p/bf9eba9f4e97
在/home/admin/Dong下創建如下測試目錄和文件:
mkdir folder{1..4} # 一次性創建4個文件夾,目錄名為folder1, folder2, folder3,folder4
mkdir logs
mkdir data
mkdir datafile
touch folder1/test{1..5} # 每個目錄創建5個空文件
touch folder2/test{1..5}
touch folder3/test{1..5}
touch folder4/test{1..5}
touch logs/log{1..5}
touch data/data{1..5}
touch datafile/datafile{1..5}
要求:復制/home/admin/Dong路徑下除了logs目錄和data目錄的所有文件夾及文件到/home/admin/Bing路徑下。
1.find + cpio
命令如下:
find x1 | grep -v x2 | cpio -pdm x3 # x1:源路徑,x2:排除的文件/目錄,x3:目標路徑
命令解釋:
find: 查找源路徑下的所有文件
cpio: 做文件歸檔處理
-pdm
- -p: Copy-pass 模式,即將文件/目錄拷貝到另一個位置
- -d: 根據需要創建前導目錄
- -m: 創建文件時保留以前的文件修改時間
示例:
find /home/admin/Dong | grep -vE "/logs/|/data/" | cpio -pdm /home/admin/Bing # 加了-E表示正則匹配,-v表示排除
find /home/admin/Dong | grep -vE "/logs|/data" | cpio -pdm /home/admin/Bing --不推介
推介上面的寫法,上面的寫法會復制logs和data目錄,但不會復制目錄下的文件,只是空目錄而已;
而下面的寫法會誤把/datafile也排除在外,不符合要求。
2.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時以大括號{}作為替換符號,傳遞的時候看到{}就將結果替換,可以將{}放在任意需要傳遞的參數位置上。如果多個地方使用{}就實現了多個傳遞
示例:
ls /home/admin/Dong/ | grep -v -E "logs|data" | xargs -i cp -r /home/admin/Dong/{} /home/admin/Bing/
3. rsync
rsync是遠程數據同步工具,可通過LAN/WAN快速同步多台主機間的文件。
rsync使用所謂的“rsync算法”來使本地和遠程兩個主機之間的文件達到同步,這個算法只傳送兩個文件的不同部分,而不是每次都整份傳送,因此速度相當快。
rsync同步常用命令:
rsync -av source_dir dest_dir
- -a : 包含-rtplgoD
- -r : 同步目錄時要加上,類似cp時的-r選項
- -v : 同步時顯示一些信息,讓我們知道同步的過程
- -P : 顯示同步過程,比如速率,比-v更加詳細
- -l : 保留軟連接
- -L : 加上該選項后,同步軟鏈接時會把源文件給同步
- -p : 保持文件的權限屬性
- -o : 保持文件的屬主
- -g : 保持文件的屬組
- -D : 保持設備文件信息
- -t : 保持文件的時間屬性
- --delete : 刪除DEST中SRC沒有的文件
- --exclude : 過濾指定文件,如--exclude “logs”會把文件名包含logs的文件或者目錄過濾掉,不同步
- -u : 加上該選項后,如果DEST中的文件比SRC新,則不同步
- -z : 傳輸時壓縮
排除文件/目錄
排除單個文件/目錄
rsync -avP --exclude=del_file source_dir dest_dir
排除多個文件/目錄
rsync -avP --exclude={del_file1, del_file2, ...} source_dir dest_dir
示例:
rsync -avP --exclude={data,logs} /home/admin/Dong /home/admin/Bing