Rm

刪除文件名中包含特定字元串但不包含其他字元串的文件

  • July 1, 2022

我有一些目錄,其中包含大量文件。我希望通過刪除其中包含特定字元串但沒有某些其他字元串的文件來修剪這些目錄。

例如刪除文件名中有“AAA”但沒有“BBB”、“CCC”或“DDD”的文件。

這可能嗎?

find從您想要在其中遞歸搜尋要刪除的文件的某個頂級目錄中使用:

find . -type f -name '*AAA*' ! -name '*BBB*' ! -name '*CCC*' ! -name '*DDD*' -print

以上將找到目前目錄中或之下的所有正常文件。在這些文件中,它將選擇名稱包含的文件AAA,取消選擇名稱包含的文件BBBCCCDDD(每個都!否定緊隨其後的測試),然後列印仍然選擇的文件的路徑名。

這裡使用的模式是普通的文件名通配模式(不是正則表達式)。這些需要被引用以避免在目前目錄中意外匹配名稱。

要刪除文件,請更改-print-delete.

由於-delete它是一個非標準謂詞(儘管它是一個通常實現的謂詞),因此使用-exec rm {} +它會更便攜。這將rm一次執行盡可能多的選定文件。


一般來說,有兩個要包含和排除的模式列表,假設bash為 shell,並假設文件名應該匹配任何包含模式,並且不匹配任何排除模式:

include=( '*AAA*' '*123*' )
exclude=( '*BBB*' '*CCC*' '*DDD*' )

or_filter=()
and_filter=()

for pattern in "${include[@]}"; do
   or_filter+=( -o -name "$pattern" )
done
or_filter=( "${or_filter[@]:1}" )  # remove initial -o

for pattern in "${exclude[@]}"; do
   and_filter+=( ! -name "$pattern" )
done

find . -type f \( "${or_filter[@]}" \) "${and_filter[@]}" -print

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