我使用以下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
有人可以帮帮我吗? 提前谢谢。
编辑:请注意此目录中没有子文件夹。
答案 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[@]}")