Bagaimana cara mendapatkan jalur relatif dengan ls?

8

Saya ingin melakukan sesuatu seperti ini untuk memindahkan dua file yang terakhir diunduh:

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

Sayangnya, lshanya memberikan nama file. Bagaimana saya bisa mengadaptasi kode di atas?

(Sebelum seseorang menunjukkannya, saya sadar akan masalah dalam menyalurkan output dari ls. Saya hanya akan menggunakan ini ketika saya tahu nama file yang dimaksud.)

Tim
sumber
9
Gunakan findsebagai gantinya.
Ignacio Vazquez-Abrams

Jawaban:

10

Oke, jadi jika Anda tidak akan menyerah ls, maka setidaknya cobalah untuk keluar dari kebiasaan menggunakan backticks untuk semuanya, terutama ketika xargsitu lebih cocok:

ls -rtd ~/Downloads/* | tail -n2 | xargs -I{} mv {} .
geocar
sumber
Anda xargsmenyenangkan saya lebih dari backticks. Tetapi apakah ada alasan teknis untuk memilih urutan pipa ini dan xargslebih dari penggunaan backticks atau apakah ini hanya masalah selera?
miracle173
Dalam hal ini kami hanya melihat dua file, tetapi jika kami ingin memindahkan ribuan file, kami mungkin secara tidak sengaja mencoba membuat baris perintah yang terlalu panjang.
geocar
Juga: Dalam hal hanya ratusan file, kita dapat segera mulai bekerja. Dengan backticks, kita harus menunggu hingga seluruh perintah selesai.
geocar
Juga: Ketika Anda berhasil lsxargs -0
menghentikan
3
Parsing lstidak disarankan: mywiki.wooledge.org/ParsingLs
Gilles Quenot
8

Anda dapat menggunakan GNU di findsana:

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

The find -printfpilihan:

  • %Tsuntuk menampilkan waktu sebagai zaman
  • %p jalur file

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

sunting

jika Anda perlu berurusan dengan spasi dalam nama file, saya sarankan ini solusi lain:

find -maxdepth 1 -printf '%Ts %p\n' |
    sort -n |
    cut -d ' ' -f2- |
    tail -n 2 |
    xargs -i% mv % .
Gilles Quenot
sumber
Penjelasan tambahan tentang find -printfopsi
Gilles Quenot
1
Saya ingin tahu: apakah ada alasan khusus untuk digunakan -f2-alih-alih -f2sebagai opsi cut? Untuk apa dasbor kedua?
Francesco Turco
1
Tentu Francesco Turco, seperti dikatakan man cut, itu mencetak sampai akhir jika ada lebih dari satu col.
Gilles Quenot
POST diedit untuk bekerja dengan nama file dengan spasi.
Gilles Quenot
3

Gunakan ls -rt ~/Downloads/*sebagai ganti ls -rt ~/Downloads/. Dalam ls -rt ~/Downloads/*argumen string pertama kali diperluas oleh shell (ini disebut nama file globbing ). Jadi Anda mendapatkan daftar lintasan sebagai argumen untuk ls -rtperintah, yang kemudian mengurutkannya dengan cara yang Anda tentukan dengan opsi ls. Sebaliknya, perintah ls -rt ~/Downloads/membaca konten direktori ~/Downloads/. Ini adalah daftar file tanpa jalur direktori.

keajaiban173
sumber
2

Dengan zsh:

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

Bagian (...)itu disebut kualifikasi globbing , salah satu fitur mematikan dari zsh. Setiap kualifikasi (biasanya karakter tunggal) memungkinkan untuk memfilter entri yang cocok berdasarkan atribut file (jenis, ukuran, waktu ...), mengubah urutan perluasannya, atau mengubah cara perluasannya.

Di atas, kita punya:

  • . (titik): pilih file biasa saja (bukan direktori, symlink ...)
  • om: O rder daftar oleh m waktu odification.
  • [1,2]: pilih hanya dua entri pertama.

Perhatikan juga bahwa perintah akan gagal jika tidak ada kecocokan (di mana shell lain dapat secara tidak sengaja memindahkan file / dir yang salah).

Stéphane Chazelas
sumber