Find

如何刪除文件夾中除list.txt中的名稱文件之外的文件?

  • November 10, 2019

假設文件夾/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.jpg3.jpg哪個nodeletelist.txtnodeletelist.txt?

使用rsync文件並將文件移動到虛擬目錄to-delete,然後進行安全清理:

  1. 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
  1. 刪除由/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是數組的元素。

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