Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 递归地遍历子目录并删除某些文件_Bash - Fatal编程技术网

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

Bash 递归地遍历子目录并删除某些文件,bash,Bash,我有一个音乐档案,里面有很多文件夹和子文件夹(封面艺术等),所以我没有手动删除成百上千的Folder.jpg、Desktop.ini和Thumb.db文件,而是决定编写一个简单的bash脚本,但事情变得非常混乱 我做了一个简单的测试,创建了如下虚拟文件夹: /主/虚拟/子1- 子1子1 sub1sub1sub1 sub1sub1sub2 sub2- sub2sub1 sub2sub2 sub2sub2sub1 并在这些文件夹中复制了一些随机的.jpg、.mp3、.ini文件。我的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
错误

  • 您确实支持文件名中包含空格
  • 您没有在内部for循环后导航回

  • 试试看…

    @arco444:缺少-添加了名称选项-感谢您指出这一点!