如果文件名未出现在另一个文件夹中,如何从一个文件夹中递归删除文件

如果文件名未出现在另一个文件夹中,如何从一个文件夹中递归删除文件

我有两个文件夹,一个包含 txt 文件,另一个包含同名的 .jpg 文件。但是,txt 文件比 jpg 文件多得多。

folder_1/00.txt
folder_1/01.txt 
folder_1/02.txt 
folder_1/03.txt 
folder_1/04.txt   

folder_2/00.jpg
folder_2/01.jpg 
folder_2/02.jpg 

在这里,我需要删除03.txt和,04.txt因为这些名称没有出现在folder_2中

答案1

以下是一种方法:

$ for file in folder_1/*.jpg; do 
    fileName="${file##*/}"
    [[ -e folder_2/${fileName/.txt/.jpg} ]] || echo rm -- "$file"
done
rm -- folder_1/03.txt
rm -- folder_1/04.txt

循环遍历 中名称以 结尾的for所有非隐藏文件和目录,将每个文件和目录保存为。接下来,将变量设置为 的值,直到最后一个被删除,这意味着它将是文件名,不包括目录。最后,使用,我们检查 中是否有一个同名但有扩展名的文件,如果没有,则为。如果这符合您的要求,请删除并再次运行以实际删除文件:folder_1.jpg$filefileName="${file##*/}"$fileName$file/[[ -e folder_2/${fileName/.txt/.jpg} ]] || echo rm -- $filefolder_2.txtecho rm -- "$file"echo

for file in folder_1/*.jpg; do 
    fileName="${file##*/}"
    [[ -e folder_2/${fileName/.txt/.jpg} ]] || rm -- "$file"
done

这里in不是必需的,但养成这个习惯是个好习惯:它确保之后的任何内容--都不会被解析为 的选项,因此允许命令也对以 开头的文件名起作用。rm -- "$file"--rm-

相关内容