递归遍历子目录并删除某些文件

时间:2015-03-16 16:26:35

标签: bash

我有一个包含大量文件夹和子文件夹(封面艺术等)的音乐存档,所以我决定做一个简单的bash脚本,而不是手动删除数百个Folder.jpg,Desktop.ini和Thumb.db文件。但事情变得非常混乱。

我通过创建这样的虚拟文件夹进行了简单的测试: / home / dummy / sub1 -              sub1sub1                  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,但是它停在那里而不是回到home并接下来搜索sub2。

我是Bash脚本的新手,所有帮助都表示赞赏.. 感谢。

2 个答案:

答案 0 :(得分:2)

在一个命令中,您可以运行:

find /home/dummy/sub1 -name "*.jpg" -o -name "*.ini" -o -name "*.db" -delete

如果您想查看哪些文件会被删除,请将-delete替换为-print(仅使用文件名)或将-ls替换为ls -l输出。

答案 1 :(得分:0)

这是更改后的代码......

    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
  

错误

  1. 您确实支持文件名,其中包含空格
  2. 你内心的for循环后没有导航回来..
  3. 试试吧......