Bash
複製僅覆蓋目標中較小文件的文件夾
我在/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-size
由rsync
. 從rsync
手冊:
--max-size=SIZE
這告訴 rsync 避免傳輸任何大於指定大小的文件。
因此該
find
命令對目標目錄(/home/user/original)進行操作並返回文件列表。對於每個文件,它都會生成一個bash
執行rsync
命令的 shell。選項的SIZE
參數是通過對目標文件--max-size
執行命令來設置的。stat
實際上,
rsync
處理邏輯變成了這樣:
- 如果源文件大於目標文件,該
--max-size
參數將阻止源文件被傳輸。- 如果源文件小於目標文件,傳輸將按預期進行。
此邏輯將導致僅將較小的文件從源目錄傳輸到目標目錄。
我已經以幾種不同的方式對此進行了測試,並且它按預期對我有用。但是,您可能希望在系統上嘗試之前創建目標目錄的備份。