Linux復制文件夾時排除某些文件或文件夾


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算法”來使本地和遠程兩個主機之間的文件達到同步,這個算法只傳送兩個文件的不同部分,而不是每次都整份傳送,因此速度相當快。

詳情可見:https://my.oschina.net/ccLlinux/blog/1859116

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM