删除非目录时收到提示

删除非目录时收到提示

我想在尝试删除带有 .txt 文件的非空目录时得到提示rmdir。这可能吗?

答案1

@Praveen J Kumar ,我不太清楚,所以我会尽量介绍一下基础知识。这里有四种情况:

  1. 想要在删除目录时得到提示。-iflag 用于交互式会话,并且会在删除每个文件之前询问您。-r用于递归,即遍历整个目录和子目录等...然后使用:

    $ rm -ri <directory path>
    
  2. 想要在删除目录时得到提示,然后使用:

    $ rm -r <directory path>
    
  3. 你想要仅删除目录中某些类型的文件。为此,您可以使用下面的行,其中ls -1提供一行输入,grep -iv "jpg"将从输出中选择所有ls非格式文件jpg(此处-i标志不区分大小写,并且-v适用于除“jpg”字符串之外的任何内容),并在输出上xargs rm执行rmgrep。例如,我想删除目录中的所有文件,除了jpg

    $ ls -1
    one.txt
    three.jpg
    three.csv
    three.sh
    two.txt
    $ ls -1 | grep -iv "jpg" | xargs rm
    $ ls
    three.jpg
    
  4. rmdir默认情况下不会删除非空目录,所以你很好:-)。

最后注意:当选择-i标志时,如果目录有很多文件,它可能会变得乏味,因为它会提示您输入每个文件。

答案2

当您想要确认删除某个目录时,它rmdir不会-i像命令那样提供标志。rm但是,当它在空目录上操作时rmdir返回退出代码。0例如:

$ mkdir emptydir && rmdir emptydir && echo $?
0

正如您所看到的,删除空目录时它不会要求我们确认。我们构建确认机制的唯一方法rmdir是编写一个我们称之为的包装器rmemptydir。我写了两个版本来展示两种不同的方法。

首选方法

#!/bin/bash

    [[ $# = 0 ]] &&  printf '%s\n' "rmdir [dirname]" exit 1
     shopt -s nullglob dotglob
    files=( ${1+"$1/"}* )
    (( ${#files[*]} )) || { rm -ri "$1" && exit 1; } && printf '%s\n' "Dir not empty" 
    shopt -u nullglob dotglob

1) 该脚本接受一个参数,即目录名称。不提供参数时退出

2)位置参数$1保存目录(作为包含元素的数组)

3) 检查数组的元素数量,如果不是,0则转到printf '%s\n' "Dir not empty"else run rm -ri "$1" && exit 1,我们就完成了。

这同样适用于第二种方法,除了我们使用pushdpopdpush堆栈的目录以及pop来自堆栈的目录。

好奇它在后台如何工作?

放在set -x的正下方并在和之后#!/bin/bash 移除>/dev/nullpushdpopd

第二种方法使用pushdpopd

#!/bin/bash

 if [[ $# = 0 ]]; then
    printf '%s\n' "rmdir [dirname]" 
    exit 1
 fi
 shopt -s nullglob dotglob
  pushd "$1" >/dev/null
  files=(*)
  (( ${#files[*]} )) || { popd >/dev/null && rm -ri "$1" && exit 0 ;} && printf '%s\n' "Dir not empty" 
  shopt -u nullglob dotglob

以下内容不起作用,因为rmdir只能删除空目录,并且我们music.mp3的目录中有一个。

mkdir emptydir && touch emptydir/music.mp3 && rmdir emptydir && echo $?
rmdir: failed to remove ‘emptydir’: Directory not empty

相关内容