Pregunta

Estoy empezando con un archivo que contiene una lista de cientos de archivos (rutas completas) en un orden aleatorio. Me gustaría enumerar los detalles de los diez últimos archivos de esa lista. Este es mi intento ingenuo:

$ ls -las -t `cat list-of-files.txt` | head -10

que funciona, siempre y cuando ninguno de los archivos tienen espacios en, pero no si lo hacen que los archivos que se dividen en los espacios y se tratan como archivos separados. Archivo "hola mundo" me da:

ls: hello: No such file or directory
ls: world: No such file or directory

He intentado citar los archivos en el archivo original de lista de archivos, pero el documento interno todavía divide los archivos arriba en los espacios en los nombres de archivo, el tratamiento de las comillas como parte de los nombres de archivo:

$ ls -las -t `awk '{print "\"" $0 "\""}' list-of-files.txt` | head -10

ls: "hello: No such file or directory
ls: world": No such file or directory

La única manera que puedo pensar en hacer esto, es a ls cada archivo individualmente (utilizando xargs tal vez) y crear un archivo intermedio con los listados de archivos y la fecha en un orden clasificable como el primer campo de cada línea, a continuación, ordenar ese archivo intermedio. Sin embargo, se siente un poco engorroso e ineficiente (cientos de comandos ls en lugar de uno o dos). Pero eso puede ser la única manera de hacerlo?

¿Hay alguna manera de pasar "ls" una lista de archivos para procesar, donde esos archivos podrían contener espacios -. Parece que debe ser simple, pero estoy perplejo

¿Fue útil?

Solución

En lugar de "uno o más caracteres en blanco", se puede obligar a bash para usar otro separador de campo:

OIFS=$IFS
IFS=$'\n'

ls -las -t $(cat list-of-files.txt) | head -10
IFS=$OIFS

Sin embargo, no creo que este código sería más eficiente que hacer un bucle; Además, eso no funcionará si el número de archivos en la lista de files.txt-excede el número máximo de argumentos.

Otros consejos

Prueba esto:

xargs -a list-of-files.txt ls -last | head -n 10

No estoy seguro de si esto va a funcionar, pero ¿Usted intentó espacios que escapan con \? El uso de sed o algo así. sed "s/ /\\\\ /g" list-of-files.txt, por ejemplo.

Esto funcionó para mí:

xargs -d\\n ls -last < list-of-files.txt | head -10
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top