linux Bash.删除路径中的所有文件夹

kcwpcxri  于 2023-06-29  发布在  Linux
关注(0)|答案(2)|浏览(156)

我在变量中有一个像/mnt/testfolder1/testfolder2这样的路径,我想检查每个文件夹是否为空,然后删除它(testfolder2然后testfolder1)。如何在bash中做到这一点?

icnyk63a

icnyk63a1#

使用-p switch of rmdir
删除路径名中的所有目录。对于每个dir操作数:
1.应删除其命名的目录条目。
1.如果dir操作数包括多个路径名组件,则应发生与以下命令等效的效果:rmdir -p $(dirname dir)

path='/mnt/testfolder1/testfolder2'
rmdir -p "$path"

您也可以使用standard parameter expansion忽略/mnt前缀:

path='/mnt/testfolder1/testfolder2'
cd "${path%{${path#/*/}}" # cd /mnt/
rmdir -p "${path#/mnt/}"  # rm -p testfolder1/testfolder2
cd -                      # go back to previous directory

或者,自己实现逻辑:尝试删除目录(如果不为空,则会失败),然后在每次循环迭代中剥离最后一个组件:

path='/mnt/testfolder1/testfolder2'
while rmdir "$path" 2>/dev/null; do
  path="${path%/*}"
done

要在/mnt处停止,请执行以下操作:

path='/mnt/testfolder1/testfolder2'
while [ "$path" != '/mnt' ] && rmdir "$path" 2>/dev/null; do
  path="${path%/*}"
done

我也想强调一下umläute's find based solution,尽管有一些修改:

path='/mnt/testfolder1/testfolder2'
find "${path%${path#/*/*/}}" -depth -type d -empty -delete

这将只删除空目录,从叶目录开始。参数扩展只保留路径的前2个组件(mnttestfolder1

oo7oh9g9

oo7oh9g92#

只需递归删除:

rm -rf /mnt/testfolder1

作为一个解释:

$ man rm
[...]
       -f, --force
              ignore nonexistent files and arguments, never prompt
[...]
       -r, -R, --recursive
              remove directories and their contents recursively

如果只想删除 * 空 * 文件夹,可以用途:

find /tmp/testfolder1 -depth -type d -delete

使用man find来找出这实际上做了什么,它留给用户作为练习。

相关问题