您知道如何删除非图像文件(.png,.jpg等)的所有文件以及所有不包含图像文件的文件夹吗?
通过命令行或shell脚本,可以吗?
注意:我使用的是Mac终端
答案 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