Bash 递归地遍历子目录并删除某些文件
我有一个音乐档案,里面有很多文件夹和子文件夹(封面艺术等),所以我没有手动删除成百上千的Folder.jpg、Desktop.ini和Thumb.db文件,而是决定编写一个简单的bash脚本,但事情变得非常混乱 我做了一个简单的测试,创建了如下虚拟文件夹: /主/虚拟/子1- 子1子1 sub1sub1sub1 sub1sub1sub2 sub2- sub2sub1 sub2sub2 sub2sub2sub1 并在这些文件夹中复制了一些随机的.jpg、.mp3、.ini文件。我的bash脚本当前看起来如下所示:Bash 递归地遍历子目录并删除某些文件,bash,Bash,我有一个音乐档案,里面有很多文件夹和子文件夹(封面艺术等),所以我没有手动删除成百上千的Folder.jpg、Desktop.ini和Thumb.db文件,而是决定编写一个简单的bash脚本,但事情变得非常混乱 我做了一个简单的测试,创建了如下虚拟文件夹: /主/虚拟/子1- 子1子1 sub1sub1sub1 sub1sub1sub2 sub2- sub2sub1 sub2sub2 sub2sub2sub1 并在这些文件夹中复制了一些随机的.jpg、.mp3、.ini文件。我的bash脚本当前
function delete_jpg_ini_db {
if [[ $f == *.jpg ]]; then
echo ".jpg file, removing $f"
gvfs-trash $f
elif [[ $f == *.ini ]]; then
echo ".ini file, removing $f"
gvfs-trash -f $f
elif [[ $f == *.db ]]; then
echo ".db file, removing $f"
gvfs-trash -f $f
else echo "not any .jpg, .ini or .db file, skipping $f"
fi
}
function iterate_dir {
for d in *; do
if [ -d $d ]; then
echo "entering sub-directory: $d" && cd $d
pwd
for f in *; do
if [ -f $f ]; then #check if .jpg, .ini or .db, if so delete
delete_jpg_ini_db
elif [ -d $f ]; then #enter sub-dir and iterate again
if [ "$(ls -A $f)" ]; then
iterate_dir
else
echo "sub-directory $f is empty!"
fi
fi
done
fi
done
}
pwd
iterate_dir
当我运行它时,它成功地迭代了sub1、sub1sub1和sub1sub1sub1,但它停在那里,而不是返回主页并搜索下一个sub2
我是Bash脚本新手,非常感谢您的帮助。。
谢谢。您可以在一个命令中运行:
find /home/dummy/sub1 -name "*.jpg" -o -name "*.ini" -o -name "*.db" -delete
如果您想查看哪些文件将被删除,请将
-delete
替换为-print
(仅文件名)或-ls
(如ls-l
输出)。以下是更改的代码
function delete_jpg_ini_db {
if [[ $f == *.jpg ]]; then
echo ".jpg file, removing $f"
gvfs-trash $f
elif [[ $f == *.ini ]]; then
echo ".ini file, removing $f"
gvfs-trash -f $f
elif [[ $f == *.db ]]; then
echo ".db file, removing $f"
gvfs-trash -f $f
else echo "not any .jpg, .ini or .db file, skipping $f"
fi
}
function iterate_dir {
for d in *; do
if [ -d "$d" ]; then
echo "entering sub-directory: $d" && cd $d
pwd
for f in *; do
if [ -f "$f" ]; then #check if .jpg, .ini or .db, if so delete
delete_jpg_ini_db
elif [ -d $f ]; then #enter sub-dir and iterate again
if [ "$(ls -A $f)" ]; then
iterate_dir
else
echo "sub-directory $f is empty!"
fi
fi
done
cd ..
fi
done
}
pwd
iterate_dir
错误
试试看…@arco444:缺少-添加了名称选项-感谢您指出这一点!