Como excluir o grupo de pastas com base no nome e na data

5

Eu tenho uma estrutura de pastas como essa.

folders
    test1
    test2.1
    test49.85
    test4.95.89
    sample
    support
    util

Estas são todas as pastas. Preciso excluir todas as pastas que começam com teste, exceto a mais recente. Eu também tenho acesso ao nome da pasta do mais recente $ {newestTestFolder}.

    
por yellavon 23.08.2012 / 18:47

2 respostas

4

Usando extglob no 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

Isso mostra que

$ rm -r !(@(${newestTestFolder}|!(test*)))

faz o que você quer em um único comando, todos dentro do Bash (com extglob habilitado) - sem chamadas de processo extras (bem, rm ).

O padrão é explicado no manual do Bash e significa

  • !() - não o padrão dentro
  • @() - um dos padrões dentro
  • | - separa padrões
por 23.08.2012 / 19:28
1

Use isto: (Eu mudei para grep apenas as pastas que começam com teste)

for i in '\ls -1 --sort time | grep ^test | tr '\n' ' ' | cut -d " " -f 2-'; 
do 
     rm -r "$i"; 
done

sim. Funciona para mim:

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

Os que restam são a pasta e a pasta mais novas que não correspondem a test Minha versão é universal - você não precisa fornecer o nome da pasta de teste mais nova.

E com relação aos comentários abaixo, você pode usar a seguinte linha em for expression

\ls -1 --sort time | grep ^test | tr ' ' '#' | tr '\n' ' ' | cut -d " " -f 2- | tr '#' ' '

se você espera ter espaços nos nomes das pastas. Eu usei # como um caractere incomum que provavelmente não está em nomes de pastas. Você pode usar outros se espera ter espaços ou # caracteres. Você pode alterar # para combinação de caracteres para limitar o risco.

Está funcionando:

 ~ > 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
 ~ >
    
por 23.08.2012 / 19:11