Shell

刪除目錄中除與給定萬用字元模式匹配的所有文件

  • June 17, 2021

我在一個目錄中有很多文件,我想刪除除一個具有相同前綴的文件之外的所有文件。例如,我有帶有模式的文件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.__.pdfmv為安全起見,該命令被註釋掉)。

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