Manipulación de archivos: Pregunta de scripting

Tengo un script que se conecta a la base de datos y obtiene todos los registros que configuran la consulta. Estos resultados de registro son archivos presentes en un servidor, por lo que ahora tengo un archivo de texto que contiene todos los nombres de archivos.

Quiero un guión que sepa:

  1. ¿Cuál es el tamaño de cada archivo en el archivo output.txt ?
  2. ¿Cuál es el tamaño total de todos los archivos presentes en ese archivo de texto?

Actualización: Me gustaría saber cómo puedo lograr mi tarea utilizando el Perl programming language , cualquier entrada sería muy apreciada.

Nota: no tengo ninguna restricción de idioma específica, podría ser el lenguaje de script Perl o Python que puedo ejecutar desde el indicador de Unix. Actualmente estoy usando el shell bash y tengo sh y py script. ¿Cómo se puede hacer esto?

Mis guiones:

 #!/usr/bin/ksh export ORACLE_HOME=database specific details export PATH=$ORACLE_HOME/bin:path information sqlplus database server information<<EOF SET HEADING OFF SET ECHO OFF SET PAGESIZE 0 SET LINESIZE 1000 SPOOL output.txt select * from my table_name; SPOOL OFF EOF 

Sé que du -h sería el comando que debería estar usando, pero no estoy seguro de cómo debería ser mi script, he probado algo en Python. Soy totalmente nuevo en Python y es mi primer esfuerzo.

Aquí está:

 import os folderpath='folder_path' file=open('output file which has all listing of query result','r') for line in file: filename=line.strip() filename=filename.replace(' ', '\ ') fullpath=folderpath+filename # print (fullpath) os.system('du -h '+fullpath) 

Los nombres de archivo en el archivo de texto de salida, por ejemplo, son como: 007_009_Bond Is Here_009_Yippie.doc

Cualquier orientación sería muy apreciada.

Actualizar:

  1. ¿Cómo puedo mover todos los archivos que están presentes en el archivo output.txt a alguna otra ubicación de carpeta usando Perl ?
  2. Después de hacer el paso 1, ¿cómo puedo eliminar todos los archivos que están presentes en el archivo output.txt?

Cualquier sugerencia sería altamente apreciada.

En Perl, el operador -s filetest es probablemente lo que quieres.

 use strict; use warnings; use File::Copy; my $folderpath = 'the_path'; my $destination = 'path/to/destination/directory'; open my $IN, '<', 'path/to/infile'; my $total; while (<$IN>) { chomp; my $size = -s "$folderpath/$_"; print "$_ => $size\n"; $total += $size; move("$folderpath/$_", "$destination/$_") or die "Error when moving: $!"; } print "Total => $total\n"; 

Tenga en cuenta que -s da tamaño en bytes, no en bloques como du .

En una investigación adicional, perl’s -s es equivalente a du -b . Probablemente debería leer las páginas de manual de su du específica para asegurarse de que realmente está midiendo lo que pretende medir.

Si realmente desea los valores du , cambie la asignación a $size anterior para:

 my ($size) = split(' ', `du "$folderpath/$_"`); 

Ojos, puedes hacer que TU guión funcione de esta manera:

1) Elimine la línea filename=filename.replace(' ', '\ ') escape es más complicado que eso, y debe citar la ruta completa o usar una biblioteca de Python para escapar de ella en función del sistema operativo específico;

2) Es probable que falte un delimitador entre la ruta y el nombre del archivo;

3) Necesita comillas simples alrededor de la ruta completa en la llamada a os.system.

Esto funciona para mí:

 #!/usr/bin/python import os folderpath='/Users/andrew/bin' file=open('ft.txt','r') for line in file: filename=line.strip() fullpath=folderpath+"/"+filename os.system('du -h '+"'"+fullpath+"'") 

El archivo “ft.txt” tiene nombres de archivo sin ruta y la parte de la ruta es '/Users/andrew/bin' . Algunos de los archivos tienen nombres que deberían eliminarse, pero esto se soluciona con las comillas simples alrededor del nombre del archivo.

Eso ejecutará du -h en cada archivo en el archivo .txt, pero no le da el total. Esto es bastante fácil en Perl o Python.

Aquí hay un script de Python (basado en el tuyo) para hacer eso:

 #!/usr/bin/python import os folderpath='/Users/andrew/bin/testdir' file=open('/Users/andrew/bin/testdir/ft.txt','r') blocks=0 i=0 template='%d total files in %d blocks using %d KB\n' for line in file: i+=1 filename=line.strip() fullpath=folderpath+"/"+filename if(os.path.exists(fullpath)): info=os.stat(fullpath) blocks+=info.st_blocks print `info.st_blocks`+"\t"+fullpath else: print '"'+fullpath+"'"+" not found" print `blocks`+"\tTotal" print " "+template % (i,blocks,blocks*512/1024) 

Tenga en cuenta que no tiene que citar ni escapar el nombre del archivo esta vez; Python lo hace por ti. Esto calcula los tamaños de archivo utilizando bloques de asignación; De la misma manera que lo hace du . Si ejecuto du -ahc contra los mismos archivos que he enumerado en ft.txt , obtengo el mismo número (bueno, du ; lo reporta como 25M y recibo el informe como 24324 KB ) pero reporta el mismo número de bloques. (Nota al margen: siempre se asume que los “bloques” tienen 512 bytes bajo Unix, aunque el tamaño real del bloque en un disco más grande es siempre más grande).

Finalmente, es posible que desee considerar la creación de su secuencia de comandos para que pueda leer un grupo de archivos de la línea de comandos en lugar de codificar el archivo y la ruta en la secuencia de comandos. Considerar:

 #!/usr/bin/python import os, sys total_blocks=0 total_files=0 template='%d total files in %d blocks using %d KB\n' print for arg in sys.argv[1:]: print "processing: "+arg blocks=0 i=0 file=open(arg,'r') for line in file: abspath=os.path.abspath(arg) folderpath=os.path.dirname(abspath) i+=1 filename=line.strip() fullpath=folderpath+"/"+filename if(os.path.exists(fullpath)): info=os.stat(fullpath) blocks+=info.st_blocks print `info.st_blocks`+"\t"+fullpath else: print '"'+fullpath+"'"+" not found" print "\t"+template % (i,blocks,blocks*512/1024) total_blocks+=blocks total_files+=i print template % (total_files,total_blocks,total_blocks*512/1024) 

Luego puede ejecutar el script (después de chmod +x [script_name].py ) mediante ./script.py ft.txt y luego utilizará la ruta al archivo de línea de comandos como la ruta supuesta a los archivos “ft.txt” . También puede procesar varios archivos.

Puedes hacerlo en tu shell shell.

Tiene todos los nombres de los archivos en el archivo output.txt , todo lo que debe agregar al final de la secuencia de comandos existente es:

 < output.txt du -h 

Dará el tamaño de cada archivo y también un total al final.

Puede usar el esqueleto de Python que ha dibujado y agregar os.path.getsize(fullpath) para obtener el tamaño del archivo individual.

Por ejemplo, si quisiera un diccionario con el nombre y el tamaño del archivo, podría:

 dict((f, os.path.getsize(f)) for f in file) 

Tenga en cuenta que el resultado de os.path.getsize(...) está en bytes, por lo que tendrá que convertirlo para obtener otras unidades si lo desea.

En general, os.path es un módulo clave para manipular archivos y rutas.