Uma solução de trabalho não tão elegante (confira seu ambiente:
Vamos começar com uma abordagem dividi e impera porque é mais claro:
ListToSave=$(ls -dt */ |head -n $NUMBEROFFOLDERS| cut -f1 -d'/';)
Esta linha armazena a lista de pastas a serem salvas na variável ListToSave
, talvez reciclável posteriormente no script ...
echo "$ListToSave"| awk 'BEGIN{printf("find . -maxdepth 1 -not -path \".\" ")}\
{printf ("-not -path \"./"$0"\" ") } \
END{print " -exec /bin/rm -rvf \"{}\" \; "}' | /bin/sh
Com este comando de 3 linhas abrangidas, você constrói um comando find
para excluir todos os diretórios, exceto os que serão salvos, e executá-lo em um shell (neste caso, /bin/sh
).
Você pode verificar a construção do comando apagando o pipe para o shell | /bin/sh
.
Por razões de segurança, é sempre mais seguro executar o comando com o caminho completo. (melhor /bin/rm
then rm
, apenas para evitar algum trojan)
Comentário:
Não é seguro analisar a saída de ls
quando você planeja fazer um script. Acontece com frequência que você começa com uma situação limitada e sob controle; depois de algum tempo, quando você já esqueceu, você deve tentar usar em um caso mais complexo e menos sob controle. Quando finalmente você está convencido de que tudo funciona bem ... acontece alguma coisa e você percebe tarde demais.
Notas:
- Não é seguro analisar a saída de
ls
... verifique aqui, ou seja, -
ls -dt */ | cut -f1 -d'/'
deve listar apenas os diretórios e nem mesmo os arquivos. -
xargs
executa imediatamente a linha de comando, como você pode ler em sua página de manualxargs - build and execute command lines from standard input
Eu sugiro que você evite fazer o que segue .
Se você quiser, no entanto, analisar ls
, você pode escrever como uma modificação mínima da sua tentativa anterior algo semelhante a este
TOBEDELETED='(ls -dt */ |head -n $NUMBEROFFOLDERS | cut -f1 -d'/'; ls)| sort | uniq -u | xargs echo "rm -rfv"'
desta forma você terá a saída armazenada em TOBEDELETED
que você pode executar mais tarde no script enquanto escreve.
Observação: não funciona com nomes de arquivos kind como espaços, \t
, \n
... e pode criar efeitos colaterais imprevisíveis. Imagine que você tenha que deletar o diretório "1 bis", mas não o diretório "1" que existe também. Você irá deletar o diretório "1" e você terá um erro quando tentar deletar o diretório "bis" se isso não existir.