快速提问:我想从目前的目录中删除除1个文件和1个目录以外的所有目录。我该怎么办?
案例场景:
我有一个目录,其中有三个目录a b c和三个文件1.php 2.php 3.php。我想删除目录a,b和文件1.php和2.php!我正在努力做到这一点。
解决方案应该扩展,即我不想列出我想要删除的所有文件,只列出应该保留的文件。
我该怎么办?
答案 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