如何删除多个子目录中匹配的没有路径的文件名列表?

如何删除多个子目录中匹配的没有路径的文件名列表?

如何删除多个子目录中匹配的没有路径的文件名列表?

Delete_list.txt 可能包含(每个文件名占一行):

a.jpg
b.jpg
c.jpg

这些文件可能存在于多个子目录中。我想将它们全部删除。我试过了,但没有成功:

for f in $(delete_list.txt); do find . -name "$f" -type f -delete  ; done 

第二次尝试

  f in $(delete_list.txt);  do find . -name "$f" -type f -exec rm -f {} \;

第三次尝试

while IFS= read -r file ; do rm -r -- "$file" ; done < delete_list.txt

第四次尝试

for f in $(delete_list.txt); do if [ -f $f ]; then rm $f; fi; done

答案1

在支持数组的 shell(例如 bash)中,您可以将所有名称组合成一个find谓词

#!/bin/bash

declare -a namep=()

while IFS= read -r name; do 
  namep+=( -name "$name" -o )
done < delete_list.txt

unset namep[-1]    # remove the extraneous trailing -o

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

仅当您确信找到正确的文件时才更改-print-delete(或)。-print -delete

答案2

这对我来说很管用。它删除了所有子目录下给定文件中的所有匹配文件名。

但是,它的速度非常慢。delete_list.txt 包含大约 100 个文件名,位于 25 万多个子目录下。

 while read -r FILE; do echo "$(find . -name "$FILE" -type f -delete): $FILE"; done < delete_list.txt

相关内容