我想在尝试删除带有 .txt 文件的非空目录时得到提示rmdir
。这可能吗?
答案1
@Praveen J Kumar ,我不太清楚,所以我会尽量介绍一下基础知识。这里有四种情况:
你做想要在删除目录时得到提示。
-i
flag 用于交互式会话,并且会在删除每个文件之前询问您。-r
用于递归,即遍历整个目录和子目录等...然后使用:$ rm -ri <directory path>
你不想要在删除目录时得到提示,然后使用:
$ rm -r <directory path>
你想要仅删除目录中某些类型的文件。为此,您可以使用下面的行,其中
ls -1
提供一行输入,grep -iv "jpg"
将从输出中选择所有ls
非格式文件jpg
(此处-i
标志不区分大小写,并且-v
适用于除“jpg”字符串之外的任何内容),并在输出上xargs rm
执行rm
的grep
。例如,我想删除目录中的所有文件,除了jpg
:$ ls -1 one.txt three.jpg three.csv three.sh two.txt $ ls -1 | grep -iv "jpg" | xargs rm $ ls three.jpg
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
,我们就完成了。
这同样适用于第二种方法,除了我们使用pushd
和popd
到push
堆栈的目录以及pop
来自堆栈的目录。
好奇它在后台如何工作?
放在set -x
的正下方并在和之后#!/bin/bash
移除>/dev/null
pushd
popd
第二种方法使用pushd
和popd
#!/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