如何删除多个子目录中匹配的没有路径的文件名列表?
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