unix bash shell脚本,用于仅在没有文件时删除目录

6yt4nkrj  于 2022-11-04  发布在  Unix
关注(0)|答案(3)|浏览(167)

好的,我正在写一个shell脚本来删除一个目录,但前提是里面没有文件。
我想做的是有一个if语句,它将检查目录中是否有文件,如果有文件,则询问用户是否要先删除文件,然后再删除目录。
我已经看了相当多,并找到了一种方法来检查文件是否存在于目录中,但我还没有能够使它过去的阶段。
下面是我到目前为止创建的if语句,用于检查文件是否存在于目录中:

echo "Please type the name of the directory you wish to remove "

                read dName
        shopt -s nullglob
        shopt -s dotglob
        directory=$Dname

        if [ ${#directory[@]} -gt 0 ];
        then
                echo "There are files in this directory! ";
        else
                echo "This directory is ok to delete! "
        fi
        ;;
r6l8ljro

r6l8ljro1#

你不需要检查; rmdir将只删除空目录。

$ mkdir foo
$ touch foo/bar
$ rmdir foo
rmdir: foo: Directory not empty
$ rm foo/bar
$ rmdir foo
$ ls foo
ls: foo: No such file or directory

在更实际的设置中,您可以使用带有if语句的rmdir命令来询问用户是否要删除所有内容。

if ! rmdir foo 2> /dev/null; then
    echo "foo contains the following files:"
    ls foo/
    read -p "Delete them all? [y/n]" answer
    if [[ $answer = [yY] ]]; then
        rm -rf foo
    fi
fi
smdnsysy

smdnsysy2#

感觉就像是在语法中混合了一些语言。对脚本做最小的修改,你可以使用bash globing来查看它是否已满(也可以创建一个数组,但没有很好的理由),尽管我可能仍然会使用类似于chepner's script的东西,让rmdir来处理错误检查。


# !/bin/bash

echo "Please type the name of the directory you wish to remove "

read dName
[[ ! -d $dName ]] && echo "$dName is not a directory" >&2 && exit 1 
shopt -s nullglob
shopt -s dotglob

found=
for i in "$dName"/*; do
  found=: && break
done

[[ -n $found ]] && echo 'There are files in this directory!' || echo 'This directory is ok to delete!'

请注意原始语法中的几个错误:

  • 变量名区分大小写,$dName不等于$Dname(如果变量名中包含空格或其他特殊字符,则应使用引号将其括起来)
  • directory不是数组,您可以通过执行类似directory=($Dname/*)的操作使其成为数组
  • !将尝试在双引号中执行历史记录扩展(如果您启用了该选项)。
q5lcpyga

q5lcpyga3#

如果目录不为空,rmdir将引发一个错误,并且如果您之前运行了set -e,您的脚本将停止。您可以在删除目录之前检查ls的输出以查看该目录是否为空:

[ "$(ls -A "$directory")" ] || rmdir "$directory"

它不容易出现争用情况,因为如果在第一个命令之后和第二个命令之前将文件添加到目录中,它将引发错误。

相关问题