Bash脚本删除给定目录中的所有图像文件

时间:2016-01-18 14:29:03

标签: bash shell

我使用以下shell脚本来清​​理我正在运行的python脚本的后果:

echo "Cleaning up..."
# some other files removed here...
# removing some log files
if [ -f log_errors.txt ]; then
    rm log_errors.txt
fi
# removing all the generated image files
if [ -f IMG_* ]; then
    rm IMG_*
fi
# some more files removed here...
ls

但是,在执行bash clean.sh时,我收到以下错误:

Cleaning up...
clean.sh: line 11: [: too many arguments

有人可以帮帮我吗? 提前谢谢。

编辑:请注意此目录中没有子文件夹。

4 个答案:

答案 0 :(得分:8)

IMG_*正在扩展到与模式匹配的完整文件列表,因此您的测试最终会变成if [ -f IMG_1 IMG_2 IMG_3 ...,这个参数太多了!

如果您始终要删除与该模式匹配的所有文件,请将-f参数传递给rm并丢失if

rm -f IMG_*

这将删除所有内容,如果没有找到文件则不执行任何操作。

答案 1 :(得分:1)

您可以尝试:

#!/bin/bash
for f in IMG_* ; do
    if [ -f "$f" ] ; then
        rm "$f"
    fi
done

这会迭代所有以IMG_开头的文件并在其上运行rm

如果它们存在,则省略子文件夹。

编辑: 由于评论而修复

答案 2 :(得分:1)

对不起之前的答案我不准确。

关注代码在centos 6.5上工作。 如果在当前目录上运行。与-maxdepth 1

find . -maxdepth 1 -name "IMG_*" -or -name "log_errors.txt" -exec rm -fv {} +

你打击了

find . -maxdepth 1 -name "IMG_*" -or -name "log_errors.txt"

请务必先使用-exec

  find . -maxdepth 1 -name "IMG_*" -or -name "log_errors.txt" | xargs  -I {} -t rm -fv {}

谢谢mklement0。你是个好人(:

答案 3 :(得分:-1)

如果要检查文件是否存在,可以使用:

imgs=(IMG_*)
[ -f "${imgs[0]}" ] && rm "${imgs[@]}"

无论是否设置了nullglob选项,它都有效,因为如果没有这样的文件,${imgs[0]}将是模式IMG_*

如果您使用shopt -s nullglob设置选项,则可以查看(请注意使用子shell - (...) - 来设置nullglob设置的效果:

(shopt -s nullglob; imgs=(IMG_*)
[ ${#imgs[@]} -gt 0 ] && rm "${imgs[@]}")