如何根据名称和日期删除文件夹组

如何根据名称和日期删除文件夹组

我有一个像这样的文件夹结构。

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
 ~ >

相关内容