我正在研究这个应该删除具有特定扩展名的文件的bash脚本,当我检查这些文件是否仍然存在时,我不希望它返回没有这样的文件或目录输出。相反,我希望它返回一个自定义消息,如:“您已经删除了文件”。 这是脚本:
#!/usr/bin/env bash
read -p "are you sure you want to delete the files? Y/N " -n 1 -r
echo
if [[ $REPLY =~ ^[Yy]$ ]]
then
rm *.torrent
rm *.zip
rm *.deb
echo "all those files have been deleted............."
fi
答案 0 :(得分:1)
你可以这样做:
rm *.torrent *.zip *.deb 2>/dev/null \
&& echo "all those files have been deleted............." \
|| echo "you have already removed the files"
当所有文件都存在时,这将按预期工作, 当它们都不存在时。
如果其中一些存在但并非全部存在,那么您没有提及要做什么。
例如,有一些.torrent
个文件,但没有.zip
个文件。
要添加第三个案例, 那里只有一些文件(现在被删除), 您需要检查每种文件类型的删除的退出代码, 并根据该报告制作报告。
以下是一种方法:
rm *.torrent 2>/dev/null && t=0 || t=1
rm *.zip 2>/dev/null && z=0 || z=1
rm *.deb 2>/dev/null && d=0 || d=1
case $t$z$d in
000)
echo "all those files have been deleted............." ;;
111)
echo "you have already removed the files" ;;
*)
echo "you have already removed some of the files, and now all are removed" ;;
esac
答案 1 :(得分:0)
您可以选择一些相对优雅的选项。
一种方法是将rm
包装在一个函数中,该函数检查您的文件夹中是否存在要删除的类型的文件。根据{{3}},您可以使用ls
检查是否有与您的通配符匹配的文件:
#!/usr/bin/env bash
rm_check() {
if ls *."${1}" 1> /dev/null 2>&1; then
rm *."${1}"
echo "All *.${1} files have been deleted"
else
echo "No *.${1} files were found"
fi
}
read -p "are you sure you want to delete the files? Y/N " -n 1 -r
echo
if [[ $REPLY =~ ^[Yy]$ ]]; then
rm_check torrent
rm_check zip
rm_check deb
fi
这个版本很不错,因为它的所有内容都按照您原先计划的方式布局。
在我看来,一个更干净的版本只会查看与您的模式匹配的文件。正如我在评论中建议的那样,您可以使用单个find
命令执行此操作:
#!/usr/bin/env bash
read -p "are you sure you want to delete the files? Y/N " -n 1 -r
echo
if [[ $REPLY =~ ^[Yy]$ ]]; then
find -name '*.torrent' -o -name '*.zip' -o -name '*.deb' -delete
echo "all those files have been deleted............."
fi
此方法使您的脚本非常短。此方法唯一可能的缺点是它不会报告缺少哪些文件类型。