Find
如何刪除文件夾中除list.txt中的名稱文件之外的文件?
假設文件夾
/photo
中有很多文件,例如1.jpg 2.jpg 3.jpg 4.jpg 5.jpg 6.jpg 7.jpg 8.jpg 9.jpg 10.jpg
我
nodeletelist.txt
在此文本文件中有一個文件名,名稱為不刪除文件列表,如1.jpg 2.jpg 3.jpg nodeletelist.txt
如何刪除文件:
4.jpg ... 10.jpg
除了文件
1.jpg
,2.jpg
和3.jpg
哪個nodeletelist.txt
在nodeletelist.txt
?
使用
rsync
文件並將文件移動到虛擬目錄to-delete
,然後進行安全清理:
rsync
在幹模式下執行下面的命令(--dry-run
如果結果很好則刪除)rsync --dry-run -v -d --remove-source-files \ --exclude='*/' \ --exclude-from='/path/to/nodeletelist.txt' \ /path/to/source /path/to/source/to-delete
- 刪除由
/path/to/source/to-delete
創建的目錄rsync
(注意:rsync
如果它不存在,可以在目標中創建最後一級目錄)並在仔細檢查後將文件移到那裡。rm -irv #/path/to/source/to-delete
解釋
rsync
選項:# --dry-run 'dry run' # -v 'verbose' # -d 'override recursive' # --remove-source-files 'sender removes synchronized files (non-dir)' # --exclude='*/' 'exclude all directories' # --exclude-from='...' 'exclude list of files reading from specified path'
如果
zsh
是一個選項,您可以定義一些符合全球標準的 shell 程式碼,例如% cmd() { ! grep -q $REPLY ./nodeletelist.txt ; }
然後(從
photo/
目錄)% ls 10.jpg 1.jpg 2.jpg 3.jpg 4.jpg 5.jpg 6.jpg 7.jpg 8.jpg 9.jpg nodeletelist.txt % ls *(+cmd) 10.jpg 4.jpg 5.jpg 6.jpg 7.jpg 8.jpg 9.jpg
看起來不錯,我們刪除
% rm *(+cmd) % ls 1.jpg 2.jpg 3.jpg nodeletelist.txt
可能有一個更有效的實現,首先將文件映射到數組中,然後測試是否
$REPLY
是數組的元素。