【问题标题】:How to delete certain directory in linux如何在linux中删除某些目录
【发布时间】:2016-06-25 09:32:40
【问题描述】:

我有一个巨大的目录,其中包含很多子目录。但是有些子目录的名字是number或者像β这样的奇怪字母或者其他一些奇怪的东西。 目录如下所示:

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

目录的深度是3,我想把那些不在26 letters (a-z)里的名字的目录全部删除。 Remove ./1, ./$, ./β .../a/1, /b/β, /a/b/2

我尝试结合 findgrepparallel (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,我不想删除它们,但我认为根据正则表达式它不应该包含。

为什么会这样? 我怎样才能删除那些目录?

【问题讨论】:

  • 至少管道是没用的,任何在[]里面的字符都会被接受。
  • 这是因为 + 搜索文字 + 符号。您的目录名称不包含+,因此grep -v 允许它们全部通过。
  • 我认为使用 \+ 会搜索文字 +

标签: regex linux bash


【解决方案1】:

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

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

注意事项:

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

【讨论】:

  • 这可以删除以数字或符号为名称的目录,但仍然无法删除那些具有奇怪名称的目录,例如a,上面有一个圆圈之类的东西.我无法在键盘上输入。
  • @Ziu : 然后将.*/[a-z]+ 替换为更长的.*/[abcdefghijklmnopqrstuvwxyz]+
【解决方案2】:

你可以使用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 来检查哪些文件将被删除,然后再进行处理。

【讨论】:

  • 您的 glob 应该是 **/!([a-z])/,因为 OP 提到了 目录。此外,使用mkdir -p β/β,你会得到一些错误,因为β/ 将在β/β/ 之前被通配,在删除β/ 之后,rm 会抱怨β/β/ 不存在。这就是为什么我们喜欢使用 find-depth 来正确处理递归删除。
  • 您可以放心地忽略该投诉(或使用-f 删除),因为目标目标仍然实现。并且在内容之前删除目录意味着完整的命令将比首先递归删除每个文件更快
猜你喜欢
  • 2022-06-15
  • 2020-12-17
  • 1970-01-01
  • 1970-01-01
  • 2022-01-02
  • 2014-02-05
  • 2021-09-22
  • 1970-01-01
  • 2015-06-22
相关资源
最近更新 更多