2012-09-07 12 views
10

Necesito un script de shell que básicamente hace lo siguiente:script para crear archivos zip individuales para cada archivo .txt que encuentra y moverlos después

  • Búsquedas en una carpeta para todos los archivos txt, y para cada uno encuentra, crea un archivo zip individual con el mismo archivo txt que encontró + .zip.
  • Después de eso mueve el archivo zip creado al archivo txt.

Básicamente es una secuencia de comandos para sustituir una lista de archivos txt por su equivalente en zip pero manteniendo el mismo nombre.

he han utilizado hallazgo para encontrar los archivos que quiero postal:

find . -name '.txt.' -print 

Los resultados son los siguientes:

./InstructionManager.txt.0 
./InstructionManager.txt.1 

Esos son los archivos que desea comprimir de forma individual (por supuesto serán mucho más), pero no saben cómo usarlos como argumentos individualmente para hacer comandos como:

zip ./InstructionManager.txt.0.zip ./InstructionManager.txt.0 
mv ./InstructionManager.txt.0.zip ./InstructionManager.txt.0 
zip ./InstructionManager.txt.1.zip ./InstructionManager.txt.1 
mv ./InstructionManager.txt.1.zip ./InstructionManager.txt.1 

¿Alguna idea? Y no, no quiero un zip con todos los archivos: S Gracias

+0

Este es un one-lin er con 'encontrar'. ¿Qué intentaste? –

+0

encontrar. -name '* .txt. *' -print – catteneo

+0

Editado el post con algo más de información. – catteneo

Respuesta

14
find . -name '*.txt.*' -print -exec zip '{}'.zip '{}' \; -exec mv '{}'.zip '{}' \; 
  • Encuentra los archivos .txt
  • Las primeras cremalleras -exec los archivos
  • El segundo -exec renombra los archivos comprimidos a los nombres originales

Tenga en cuenta que este procedimiento sobrescribe los archivos originales. Para asegurarse de que los nuevos archivos son archivos zip reales, puede hacerlo:

file InstructionManager.txt.* 

que debe devolver:

InstructionManager.txt.0: Zip archive data, at least v1.0 to extract 
InstructionManager.txt.1: Zip archive data, at least v1.0 to extract 
+0

¡Eso funcionó como el encanto! : D Pero ahora necesito un poco más de mejora. Por ejemplo, como los archivos siguen siendo los mismos, si la secuencia de comandos se ejecuta una vez más, se creó un archivo comprimido dentro de un archivo comprimido dentro de un archivo comprimido ... ¿Es posible usar el resultado de ese archivo comando InstructionManager.txt. * Solo ejecutar el script si se trata de un archivo de texto real?Pero gracias por el primero: D – catteneo

+0

Ah, y otro * if * Al igual que en esta eliminación, cd/mnt/usb-storage/Logs/&& ls -t1/mnt/usb-storage/Logs/| cola -n +5 | xargs rm -r ¿comprimir cada archivo, es decir, un archivo de texto real, y ese no es uno de los últimos 5 archivos modificados? – catteneo

5

usando buscar y código postal:

find . -name '*.txt.*' -exec zip '{}.zip' '{}' \; 
1

Con find y xargs, nombres de archivo con espacios aceptadas:

find . -name '*.txt.*' -print0 | xargs -0 -r -n1 -I % sh -c '{ zip %.zip %; mv %.zip %;}' 

los archivos se comprimen y se renombran a su nombre original

Cuestiones relacionadas