¿Cómo obtener las rutas relativas con ls?

8

Me gustaría hacer algo como esto para mover los dos últimos archivos descargados:

mv ` ls -rt ~/Downloads/ | tail -2 ` .

Lamentablemente, lssolo da los nombres de los archivos. ¿Cómo puedo adaptar el código anterior?

(Antes de que alguien lo señale, soy consciente de los problemas para canalizar la salida de ls. Solo usaría esto cuando conozca los nombres de archivo en cuestión).

Tim
fuente
99
Usar en su findlugar.
Ignacio Vazquez-Abrams

Respuestas:

10

De acuerdo, así que si no te rindes ls, al menos trata de dejar el hábito de usar backticks para todo, especialmente cuando xargses mejor:

ls -rtd ~/Downloads/* | tail -n2 | xargs -I{} mv {} .
geocar
fuente
Tu xargsme agrada más que los backticks. Pero, ¿hay alguna razón técnica para preferir esta secuencia de tuberías y xargssobre el uso de backticks o es solo una cuestión de gustos?
milagro173
En este caso, solo estamos viendo dos archivos, pero si quisiéramos mover miles de archivos, podríamos intentar crear accidentalmente una línea de comando que fuera demasiado larga.
Geocar
Además: en el caso de cientos de archivos, podemos comenzar a trabajar de inmediato. Con los backticks, tenemos que esperar hasta que termine todo el subcomando.
Geocar
Además: cuando logras dejar el hábito de usar ls, puedes aprovecharxargs -0
geocar
3
lsSe desaconseja el análisis : mywiki.wooledge.org/ParsingLs
Gilles Quenot
8

Puedes usar GNU findallí:

mv $(find ~/Download -mindepth 1 -maxdepth 1 -printf '%Ts %p\n' | sort -n | cut -d ' ' -f2- | tail -n 2) .

Las find -printfopciones:

  • %Tspara mostrar el tiempo como época
  • %p la ruta del archivo

Ver man find | less +/'^ *-printf'

editar

Si necesita tratar con espacios en los nombres de archivo, le recomiendo esta otra solución:

find -maxdepth 1 -printf '%Ts %p\n' |
    sort -n |
    cut -d ' ' -f2- |
    tail -n 2 |
    xargs -i% mv % .
Gilles Quenot
fuente
Explicaciones find -printfadicionales sobre las opciones
Gilles Quenot
1
Tengo curiosidad: ¿hay alguna razón en particular para usar en -f2-lugar de -f2como una opción cut? ¿Para qué es el segundo guión?
Francesco Turco
1
Claro, Francesco Turco, como dijo man cut, imprime hasta el final si hay más de una columna.
Gilles Quenot 01 de
POST editado para trabajar con nombres de archivos con espacios.
Gilles Quenot
3

Usar en ls -rt ~/Downloads/*lugar de ls -rt ~/Downloads/. En ls -rt ~/Downloads/*el argumento, la cadena se expande primero por el shell (esto se denomina globbing de nombre de archivo ). Entonces obtienes una lista de rutas como argumentos para el ls -rtcomando, que luego lo ordena de la manera que especifiques mediante las opciones de ls. Por el contrario, el comando ls -rt ~/Downloads/lee el contenido del directorio ~/Downloads/. Esta es una lista de archivos sin la ruta del directorio.

milagro173
fuente
2

Con zsh:

mv ~/Downloads/*(.om[1,2]) .

La (...)parte se llama calificadores de globbing , una de las características asesinas de zsh. Cada calificador (generalmente caracteres únicos) permite filtrar las entradas coincidentes en función de los atributos de los archivos (tipo, tamaño, tiempo ...), alterar el orden en que se expanden o modificar cómo se expanden.

Arriba, tenemos:

  • . (punto): seleccione solo archivos normales (no directorios, enlaces simbólicos ...)
  • om: O rden la lista por m tiempo ODIFICACIÓN.
  • [1,2]: seleccione solo las dos primeras entradas.

También tenga en cuenta que el comando fallará si no hay coincidencia (donde otros shells podrían mover accidentalmente el archivo / directorio incorrecto).

Stéphane Chazelas
fuente