Bash

複製僅覆蓋目標中較小文件的文件夾

  • January 16, 2019

我在/home/user/original的多個子文件夾中有大量 PDF ,我使用 /home/user/compressed 中的ghostscript pdfwrite進行了壓縮

ghostscript在壓縮大約 90% 的文件方面做得很好,但其余文件最終都比原始文件大。

我想cp /home/user/compressed到*/home/user/original*覆蓋小於目標文件的文件,而跳過較大的文件。

有任何想法嗎?

以下find命令應該適用於此:

cd /home/user/original
find . -type f -exec bash -c 'file="$1"; rsync --max-size=$(stat -c '%s' "$file") "/home/user/compressed/$file" "/home/user/original/$file"' _ {} \;

該解決方案的關鍵部分是--max-sizersync. 從rsync手冊:

--max-size=SIZE

這告訴 rsync 避免傳輸任何大於指定大小的文件。

因此該find命令對目標目錄(/home/user/original)進行操作並返回文件列表。對於每個文件,它都會生成一個bash執行rsync命令的 shell。選項的SIZE參數是通過對目標文件--max-size執行命令來設置的。stat

實際上,rsync處理邏輯變成了這樣:

  1. 如果源文件大於目標文件,該 --max-size參數將阻止源文件被傳輸。
  2. 如果源文件小於目標文件,傳輸將按預期進行。

此邏輯將導致僅將較小的文件從源目錄傳輸到目標目錄。

我已經以幾種不同的方式對此進行了測試,並且它按預期對我有用。但是,您可能希望在系統上嘗試之前創建目標目錄的備份。

引用自:https://unix.stackexchange.com/questions/494783