如何删除文件夹中没有图像的所有文件和文件夹?

时间:2016-04-26 07:52:03

标签: bash macos shell terminal find

您知道如何删除非图像文件(.png,.jpg等)的所有文件以及所有不包含图像文件的文件夹吗?

通过命令行或shell脚本,可以吗?

注意:我使用的是Mac终端

2 个答案:

答案 0 :(得分:3)

您可以先find all files that are not .png or .jpg删除它们。然后,遍历所有目录并尝试将它们全部删除。只有那些空的才会被删除:

find -type f ! -regex ".*\.\(jpg\|png\)" -delete
find -type d -delete

在Mac OS X上,you can't use \| in a basic regular expression,这是find默认使用的内容。因此,如果第一个表达式对您不起作用,use the -o flag

find . -type f ! \( -name "*.jpg" -o -name "*.png" \) -delete

鉴于这种结构:

$ tree
.
├── a1
│   └── a.png
├── a2
│   ├── b.jpg
│   └── b.png
└── a3
    ├── a.txt
    └── b.txt

3 directories, 5 files

有要删除的文件:

$ find -type f ! -regex ".*\.\(jpg\|png\)"
./a3/b.txt
./a3/a.txt

让我们这样做:

$ find -type f ! -regex ".*\.\(jpg\|png\)" -delete

现在让我们删除dirs:

$ find -type d -delete
find: cannot delete `./a1': Directory not empty
find: cannot delete `./a2': Directory not empty

所以我们最终得到了:

$ tree
.
├── a1
│   └── a.png
└── a2
    ├── b.jpg
    └── b.png

2 directories, 3 files

答案 1 :(得分:0)

true=0
false=1

is_empty()
{
    if [ "$(ls -A $1)" ]; then
        return $false
    fi
    return $true
}

del_img()
{
    local i   
    for i in "$1"/*; do
        # file: not png, jpg and our shell script
        if [ -f "${i}" ] && [[ "${i}" != *.png ]] && [[ "${i}" != *.jpg ]] && [[ "${i}" != *.sh ]]; then
            echo "remove ".$(basename "${i}")
            rm "${i}"            
        fi

        # folder: access inside
        if [ -d "${i}" ]; then            
            del_img "${i}"
        fi

        # folder: remove if empty
        if [ -d "${i}" ] && is_empty "${i}"; then
            echo "remove ".$(basename "${i}")
            rmdir "${i}"
        fi
    done
}

del_img $PWD