Come ottenere i relativi percorsi con ls?


8

Vorrei fare qualcosa del genere per spostare gli ultimi due file scaricati:

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

Sfortunatamente, lsdà solo i nomi dei file. Come posso adattare il codice sopra?

(Prima che qualcuno lo sottolinei, sono consapevole dei problemi nel piping dell'output di ls. Lo userei solo quando conosco i nomi dei file in questione.)


9
Usa findinvece.
Ignacio Vazquez-Abrams,

Risposte:


10

Va bene, quindi se non ti arrendi ls, almeno prova ad abituarti a usare i backtick per tutto, specialmente quando xargsè più adatto:

ls -rtd ~/Downloads/* | tail -n2 | xargs -I{} mv {} .

Il tuo xargsmi piace più degli apici inversi. Ma c'è qualche motivo tecnico per preferire questa sequenza di tubi e xargsl'uso di backtick o è solo una questione di gusti?
miracle173,

In questo caso stiamo solo esaminando due file, ma se volessimo spostare migliaia di file, potremmo accidentalmente provare a creare una riga di comando troppo lunga.
geocar,

Inoltre: nel caso di sole centinaia di file, possiamo iniziare a lavorare immediatamente. Con i backtick, dobbiamo attendere fino al termine dell'intero sottocomando.
geocar,

Inoltre: quando riesci a lsxargs -0
liberarti

3
L'analisi lsè scoraggiata: mywiki.wooledge.org/ParsingLs
Gilles Quenot,

8

Puoi usare GNU findlì:

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

Le find -printfopzioni:

  • %Tsper visualizzare l'ora come epoca
  • %p il percorso del file

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

modificare

se hai bisogno di occuparti degli spazi nei nomi dei file, ti consiglio un'altra soluzione:

find -maxdepth 1 -printf '%Ts %p\n' |
    sort -n |
    cut -d ' ' -f2- |
    tail -n 2 |
    xargs -i% mv % .

Aggiunte spiegazioni sulle find -printfopzioni
Gilles Quenot,

1
Sono curioso: c'è qualche motivo particolare da usare -f2-invece che -f2come opzione cut? A cosa serve il secondo trattino?
Francesco Turco

1
Sicuramente Francesco Turco, come detto man cut, stampa fino alla fine se c'è più di un col.
Gilles Quenot,

POST modificato per funzionare con nomi di file con spazi.
Gilles Quenot,

3

Usa ls -rt ~/Downloads/*invece di ls -rt ~/Downloads/. Nella ls -rt ~/Downloads/*stringa argomento viene dapprima esteso dal guscio (questo è chiamato file globbing ). Quindi ottieni un elenco di percorsi come argomenti per il ls -rtcomando, che poi lo ordina nel modo specificato dalle opzioni di ls. Al contrario, il comando ls -rt ~/Downloads/legge il contenuto della directory ~/Downloads/. Questo è un elenco di file senza il percorso della directory.


2

Con zsh:

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

La (...)parte si chiama qualificazione globbing , una delle caratteristiche killer di zsh. Ogni qualificatore (di solito caratteri singoli) consente di filtrare le voci corrispondenti in base agli attributi dei file (tipo, dimensione, tempo ...), modificare l'ordine in cui vengono espansi o modificare il modo in cui vengono espansi.

Sopra, abbiamo:

  • . (punto): seleziona solo file regolari (non directory, collegamenti simbolici ...)
  • om: O rder l'elenco in base m tempo ODIFICA.
  • [1,2]: seleziona solo le prime due voci.

Si noti inoltre che il comando fallirà se non c'è corrispondenza (dove altre shell potrebbero spostare accidentalmente il file / dir errato).

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.