7 votes

Comment puis-je bzip2 récursivement tous les fichiers qui ne sont pas bzipés ?

Comment puis-je bzip2 récursivement tous les fichiers qui ne se terminent pas par le symbole .bz2 sous Linux ?

10voto

Brad Points 1004

Find est votre ami. Je pense que ce qui suit devrait le faire :

find <target_dir> -not -name \*.bz2 -exec bzip2 \{\} \;

Par exemple, si le répertoire où se trouvent les fichiers que vous voulez compresser est /var/log/blah, ce serait :

find /var/log/blah -not -name \*.bz2 -exec bzip2 \{\} \;

1voto

chrish Points 1208

De mémoire (désolé, je n'ai pas de Shell à portée de main pour tester les citations, etc :)

for _t in `find . -print |grep -v -E "\.bz$"`; do bzip2 -9 $_t && echo OK $_t || echo FAIL $_t; done

Elle utilise find pour trouver tous les fichiers, grep pour éliminer ceux qui ont une extension .bz2, puis les envoie un par un dans bzip2. Je pense qu'une partie de la citation est fausse, cependant - je testerais d'abord séparément la partie entre guillemets.

Bonne chance ! Vous pourriez vouloir utiliser xz à la place - il compresse généralement mieux - ou même tout goudronner et bzip2 ou xz à la place.

1voto

Avec zsh ( setopt extended_glob doit être activé) :

bzip2 **/^*.bz2(.)

** récure dans les sous-répertoires ; ^*.bz2 correspond à tout sauf *.bz2 ; (.) restreint aux fichiers réguliers.

Avec bash 4, si vous êtes d'accord pour ignorer bzip2 se plaint d'être invoqué sur des répertoires :

bzip2 **/!(*.bz2)

0voto

Cookie Points 181

Voici un commentaire. Si nécessaire, installez ifne premier. Sur Ubuntu :

sudo apt-get install moreutils

Et puis :

find YOUR_DIR -type f -not -name \*.bz2 -print0 | ifne xargs -0 bzip2

Cela fait la même chose que les autres réponses, mais vous n'obtiendrez pas de messages d'avertissement sur le bzip2ing des répertoires, et s'il n'y a rien à bzip2 plus, vous ne recevrez plus de messages d'avertissement concernant l'envoi de données compressées par bzip2 dans un terminal. Il utilise également xargs usw.

YOUR_DIR peut contenir des jokers ou des répertoires multiples, par exemple YOUR*DIR ou autre.

0voto

user258532 Points 101

Dans le fish la console, c'est assez simple, et vous n'avez pas à vous soucier des tuyaux et des antislashes bizarres :

set files (find *)
for i in $files
    bzip2 $i
end

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X