Como executar um comando zSH glob recursivamente para subdiretórios

2

Eu tenho um comando ZSH glob que remove tudo menos os 10 diretórios mais recentes dentro de uma pasta.

#! /bin/zsh
cd /path/to/backups/pod1 && rm -rf ./*(Om[1,-11])

No entanto, isso é limitado apenas ao diretório pod1. Eu tenho muitos diretórios de backup no mesmo nível, ou seja, pod1, pod2, pod3 etc ... Idealmente, eu gostaria de ter um curinga como este:

cd /path/to/backups/* && rm -rf ./*(Om[1,-11])

... que faria o comando glob dentro de qualquer subdiretório de backups, conforme descrito acima.

No entanto, quando eu executo isso, recebo esta mensagem:

cd: too many arguments

Não sei bem como fazer isso.

    
por Danny Englander 29.08.2016 / 15:57

1 resposta

3

cd leva apenas um argumento. Uma abordagem é em vez de cd em cada diretório (com um sub-shell, embora não seja necessário fornecido que os diretórios sejam totalmente qualificados (isto é, os diretórios não são relativos))

for d in /path/to/backups/*; do
  ( cd $d && rm -rf ./*(om[1,-11]) )
done

Outra abordagem é apenas excluir os arquivos diretamente (aqui com uma depuração print para confirmar primeiro se os arquivos corretos foram correspondidos), já que vários globs podem ser especificados em uma expressão. Observe que isso mantém 10 arquivos no total, enquanto a solução baseada em loop mantém 10 arquivos em cada diretório.

print -l /path/to/backups/pod*/*(Om[1,-11])

No entanto, isso pode ocorrer nos limites do shell, pois muitos arquivos devem ser correspondidos. Nesse caso, xargs ou o ZSH zargs podem ser necessários.

    
por 29.08.2016 / 16:11