我有一个包含很多子目录的庞大目录。但是一些子目录的名称是数字或奇怪的字母,如β或其他一些奇怪的东西。 该目录如下所示:
/
/a,/b,/1,/0,/$,/β
/a/c,/1/a,/b/β
目录的深度为3,我想删除那些不在26 letters (a-z)
中的名称的目录。 Remove ./1, ./$, ./β ...
和/a/1, /b/β, /a/b/2
。
我尝试合并find
和grep
以及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
这样的子目录,我不想删除它,但我认为根据正则表达式它不应该包含。
为什么会这样? 我该如何删除这些目录?
答案 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
来检查在删除之前将删除哪些文件。