【问题标题】:Recursively iterating through subdirectories and removing certain file递归遍历子目录并删除某些文件
【发布时间】:2015-05-18 20:55:06
【问题描述】:

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

我通过创建这样的虚拟文件夹进行了一个简单的测试: /home/dummy/sub1 - 子1子1 子1子1子1 子1子1子2 子 2 - 子2子1 子2子2 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 脚本的新手,感谢所有帮助.. 谢谢。

【问题讨论】:

    标签: bash


    【解决方案1】:

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

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

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

    【讨论】:

    • @arco444: 缺少 -name 选项已添加 - 感谢您指出这一点!
    【解决方案2】:

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

        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 循环之后导航回来..

    试试看……

    【讨论】:

      猜你喜欢
      • 2011-06-06
      • 2014-07-31
      • 2013-03-04
      • 2021-12-28
      • 1970-01-01
      • 1970-01-01
      • 2014-04-12
      • 2019-06-24
      • 1970-01-01
      相关资源
      最近更新 更多