2012-04-28 20 views
17

Quiero iterar entre los subdirectorios de mi ubicación actual y gzip cada archivo por separado. Para comprimir los archivos en un directorio, utilizoCómo descomprimir todos los archivos en todos los subdirectorios en bash

for file in *; do gzip "$file"; done 

pero esto sólo puede trabajar en el directorio actual y no los subdirectorios del directorio actual. ¿Cómo puedo reescribir las declaraciones anteriores para que también comprima los archivos en todos los subdirectorios?

Respuesta

41

No hay necesidad de bucles o cualquier cosa más que find y gzip:

find . -type f ! -name '*.gz' -exec gzip "{}" \; 

Esto encuentra todos los archivos regulares en y por debajo del directorio actual cuyos nombres no terminan con la extensión .gz (es decir , todos los archivos que aún no están comprimidos). Invoca a gzip en cada archivo individualmente.


Editar, basado en el comentario de user unknown:

Las llaves ({}) se sustituyen con el nombre del archivo, que se transmite directamente, como una sola palabra, con el siguiente comando -exec como se puede ver aquí:

$ touch foo 
$ touch "bar baz" 
$ touch xyzzy 
$ find . -exec echo {} \; 

./foo 
./bar baz 
./xyzzy 
+2

Su última oración es una desinformación común. Buscar sabe dónde se inicia un nombre de archivo y dónde termina. En sí, no tiene ningún problema con espacios en blanco o linebreaks y otras cosas divertidas. Entonces '-exec gzip {}' llama a gzip con un solo nombre de archivo, y como no se invoca ningún shell intermedio, lo que podría interpretar un espacio en blanco como delimitador, gzip recibirá el nombre completo del archivo. La sugerencia en la página de manual de find parece obsoleta y significa: su caparazón podría intentar interpretar {} antes de pasarla para encontrarla, pero no se ha visto tal caparazón [durante años] (http://unix.stackexchange.com/q/ 8647/4485). –

+1

Aprende algo nuevo todos los días. Gracias por la lección! –

+2

+1 para los archivos de exclusión * .gz – GuruM

5
find . -type f | while read file; do gzip "$file"; done 
+1

¿Qué sucede si un archivo contiene espacios u otros caracteres especiales? que no funcionará con 'for' there – c00kiemon5ter

+1

@ c00kiemon5ter ¿Una respuesta que funciona, pero puede estar incompleta, merece un voto a la baja? De acuerdo con SO "Use sus votos bajos siempre que encuentre una publicación extremadamente descuidada, sin esfuerzo, o una respuesta que sea clara y tal vez peligrosamente incorrecta". Esta respuesta no es ninguna de esas cosas. Incompleto, algo descuidado, pero no incorrecto. Probablemente debiste dejar que el proceso de turno pasara factura y dejaste un comentario. –

+0

imo, la respuesta es incorrecta. Farshid nunca especificó que los archivos no contienen caracteres especiales, por lo que su respuesta solo responde a un caso especial de la pregunta. Es mejor que uses 'find ... | mientras lees ..'. Corrija su respuesta y seré el primero en votar. Pero no me pidas que promueva respuestas incorrectas (imo). – c00kiemon5ter

11

preferiría gzip -r ./ el que hace lo mismo pero es más corto.

Cuestiones relacionadas