我有一个像这样的文件夹结构。
folders
test1
test2.1
test49.85
test4.95.89
sample
support
util
这些都是文件夹。我需要删除所有以 test 开头的文件夹,除了最新的文件夹。我也可以访问最新的 ${newestTestFolder} 文件夹名称。
答案1
extglob
在 Bash 中使用:
$ ls -1
sample
support
test1
test2.1
test4.95.89
test49.85
util
$ newestTestFolder="test49.85"
$ shopt -s extglob
$ ls -d1 !(@(${newestTestFolder}|!(test*)))
test1
test2.1
test4.95.89
这表明
$ rm -r !(@(${newestTestFolder}|!(test*)))
在 Bash 中 (启用后) 使用单个命令完成您想要的操作extglob
- 无需额外的进程调用 (好吧,rm
)。
Bash 手册中解释了该模式的含义
!()
-不是内在的模式@()
-一模式之内|
- 分离图案
答案2
使用这个:(我已将其更改为仅 grep 以 test 开头的文件夹)
for i in `\ls -1 --sort time | grep ^test | tr '\n' ' ' | cut -d " " -f 2-`;
do
rm -r "$i";
done
是的。对我有用:
~ > ls
total 24
drwxr-xr-x 3 root root 4096 2012-08-23 01:08 Dev
drwxr-xr-x 2 root root 4096 2012-08-24 18:50 latest
drwxr-xr-x 2 root root 4096 2012-08-24 19:14 test1
drwxr-xr-x 2 root root 4096 2012-08-24 19:14 test2
drwxr-xr-x 2 root root 4096 2012-08-24 19:14 test3
drwxr-xr-x 2 root root 4096 2012-08-24 19:14 test4
~ > for i in `\ls -1 --sort time | grep ^test | tr '\n' ' ' | cut -d " " -f 2-`;
> do
> rm -r "$i";
> done
~ > ls
total 12
drwxr-xr-x 3 root root 4096 2012-08-23 01:08 Dev
drwxr-xr-x 2 root root 4096 2012-08-24 18:50 latest
drwxr-xr-x 2 root root 4096 2012-08-24 19:14 test4
~ >
剩下的是最新的文件夹和不匹配的文件夹test
我的版本是通用的 - 您不需要提供最新的测试文件夹的名称。
关于下面的评论 - 您可以在for
表达式中使用以下行
\ls -1 --sort time | grep ^test | tr ' ' '#' | tr '\n' ' ' | cut -d " " -f 2- | tr '#' ' '
如果您希望文件夹名称中有空格。我确实使用了#
作为一个不太可能出现在文件夹名称中的不常见字符。如果您希望有空格或#
字符,您可以使用其他。您可以更改#
为字符组合以限制风险。
证明它有效:
~ > ls
total 36
drwxr-xr-x 3 root root 4096 2012-08-23 01:08 Dev
drwxr-xr-x 2 root root 4096 2012-08-24 18:50 latest
drwxr-xr-x 2 root root 4096 2012-08-24 19:19 test
drwxr-xr-x 2 root root 4096 2012-08-24 19:19 test1
drwxr-xr-x 2 root root 4096 2012-08-24 19:19 test2
drwxr-xr-x 2 root root 4096 2012-08-24 19:19 test3
drwxr-xr-x 2 root root 4096 2012-08-24 19:20 test 4
drwxr-xr-x 2 root root 4096 2012-08-24 19:20 test5
drwxr-xr-x 2 root root 4096 2012-08-24 19:21 test 6
~ > for i in `\ls -1 --sort time | grep ^test | tr ' ' '#' | tr '\n' ' ' | cut -d " " -f 2- | tr '#' ' '`;
> do
> rm -r "$i";
> done
~ > ls
total 12
drwxr-xr-x 3 root root 4096 2012-08-23 01:08 Dev
drwxr-xr-x 2 root root 4096 2012-08-24 18:50 latest
drwxr-xr-x 2 root root 4096 2012-08-24 19:21 test 6
~ >