如何删除linux中的某些目录

时间:2016-06-25 09:32:41

标签: regex linux bash

我有一个包含很多子目录的庞大目录。但是一些子目录的名称是数字或奇怪的字母,如β或其他一些奇怪的东西。 该目录如下所示:

/
/a,/b,/1,/0,/$,/β
/a/c,/1/a,/b/β

目录的深度为3,我想删除那些不在26 letters (a-z)中的名称的目录。 Remove ./1, ./$, ./β .../a/1, /b/β, /a/b/2

我尝试合并findgrep以及parallel (A gnu xargs) grep工作很奇怪,如果我使用grep [a-z],它也会包含奇怪的字母,例如a with a circle on the top。 所以,我认为:

find . -type d -maxdepth 2|grep -v  '\/[a|b|c|d|e|f|g|h|i|j|K|l|m|n|o|p|q|r|s|t|u|v|w|x|y|z]+/[a|b|c|d|e|f|g|h|i|j|K|l|m|n|o|p|q|r|s|t|u|v|w|x|y|z]+'|parallel -X -r rm -r

但它只是删除了所有文件! grep输出包含.目录和/p这样的子目录,我不想删除它,但我认为根据正则表达式它不应该包含。

为什么会这样? 我该如何删除这些目录?

2 个答案:

答案 0 :(得分:4)

find本身可以使用正则表达式,为什么不使用它:

find . -maxdepth 2 -type d ! -iregex '.*/[a-z]+' -exec rm -r {} \;

注意:

  • -iregex:不区分大小写的正则表达式
  • -exec:执行命令

答案 1 :(得分:1)

您可以使用Bash's special globbing features

$ cd -- "$(mktemp --directory)"
$ mkdir a b 1
$ touch 0 '$' β a/c 1/a b/β
$ ls -R .
.:
'$'  0  1  a  b  β

./1:
a

./a:
c

./b:
β
$ shopt -s extglob globstar
$ rm -r **/!([a-z])/
$ ls -R .
.:
a  b

./a:
c

./b:

您可以使用ls -d代替rm -r来检查在删除之前将删除哪些文件。