用于删除特定文件的Bash脚本

时间:2017-10-08 13:47:36

标签: bash terminal

我正在研究这个应该删除具有特定扩展名的文件的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

2 个答案:

答案 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

此方法使您的脚本非常短。此方法唯一可能的缺点是它不会报告缺少哪些文件类型。