Shell
刪除目錄中除與給定萬用字元模式匹配的所有文件
我在一個目錄中有很多文件,我想刪除除一個具有相同前綴的文件之外的所有文件。例如,我有帶有模式的文件
filename.__<random_string>.pdf
,(文件名可以是任何長度的字元串)foo.__.pdf foo.__resume.pdf foo.__name.pdf bar.__.pdf bar.__resume.pdf bar.__name.pdf
現在從他們那裡我只想要三個具有相同前綴的文件之一,即我只想要前三個文件中的一個和後三個文件中的一個。例如,目錄應包含,
foo.__.pdf bar.__.pdf
接受任何腳本語言或 shell 的回答。
#!/bin/bash declare -A seen for name in *.__*.pdf; do prefix=${name%%.__*.pdf} if [[ -z ${seen[$prefix]} ]]; then printf 'keeping "%s"\n' "$name" seen[$prefix]=1 else printf 'deleting "%s"\n' "$name" # rm -f -- "$name" fi done
*.__*.pdf
上面的腳本從與目前目錄中的文件名通配模式匹配的每個文件名中提取前綴。如果之前沒有看到前綴,則保留該文件。否則文件將被刪除(rm
為了安全起見,該命令目前已被註釋掉)。為了跟踪已經看到的前綴,它們作為鍵儲存在一個名為 的關聯數組中
seen
。第 4 版中引入了關聯數組bash
。由於任何與相同前綴匹配
*.__*.pdf
的文件都是“等效的”,因此只需將所有這些文件重命名為相同的名稱即可將它們縮減為單個文件。這不需要關聯數組,可以通過以下方式輕鬆完成
/bin/sh
:#!/bin/sh for name in *.__*.pdf; do prefix=${name%%.__*.pdf} printf 'moving "%s" to "%s.__.pdf"\n' "$name" "$prefix" # mv -f -- "$name" "$prefix.__.pdf" done
在這裡,所有帶有前綴的文件
foo
都被移動到該名稱foo.__.pdf
(mv
為安全起見,該命令被註釋掉)。