删除linux中的几乎所有目录和文件

时间:2011-07-26 20:24:17

标签: linux bash ubuntu

快速提问:我想从目前的目录中删除除1个文件和1个目录以外的所有目录。我该怎么办?

案例场景:

我有一个目录,其中有三个目录a b c和三个文件1.php 2.php 3.php。我想删除目录a,b和文件1.php和2.php!我正在努力做到这一点。

解决方案应该扩展,即我不想列出我想要删除的所有文件,只列出应该保留的文件。

我该怎么办?

3 个答案:

答案 0 :(得分:4)

在bash中

shopt -s extglob
echo rm -r !(3.php|c)

演示

$ mkdir -p x/a x/b x/c
$ cd x
$ touch {1,2,3}.php
$ ls -F
1.php  2.php  3.php  a/  b/  c/
$ shopt -s extglob
$ echo rm -r !(3.php|c)
rm -r 1.php 2.php a b

请参阅bash手册中的pattern matching

答案 1 :(得分:1)

可替换地,

cd <directory>
rm -r a b [12].php

答案 2 :(得分:0)

在一般情况下,为了删除除一个文件之外的所有文件,它会变得更复杂。

这是一个bash(或其他shell,我没有检查它的工作原理)的解决方案:

function deleteAllBut() {
  local pattern="^($1)"
  for p in "${@:2}"
  do
    pattern="$pattern|($p)"
  done
  pattern=$pattern\$
  for f in *
  do
    [[ $f ~= $pattern ]] || echo $f
  done
}

然后你可以打电话

deleteAllBut c 3.php

列出所有本地文件,但这两个文件。 (这不会删除隐藏文件,例如名称以.开头的文件。)

它是如何工作的?它首先从命令行参数构建一个正则表达式(事先由shell扩展),然后遍历当前目录中的所有文件,并回显所有与模式不匹配的文件。

echo $f更改为rm -r $f以实际删除这些文件和目录。


以下是原始问题的原始答案。

cd <your directory>
rmdir a b
rm 1.php 2.php

这假定您的目录为空。如果不是(并且您也想删除内容),请使用

rm -r a b

而不是上面的第二行。 (-r代表递归。)

当然,您可以合并最后两行:

rm -r a b 1.php 2.php

或者,如果你想变得棘手:

rm -r a b [12].php

rm -r a b {1,2}.php