GNU/Linux >> Belajar Linux >  >> Linux

Bagaimana Mengurutkan Nama File Dalam Urutan Numerik Dan Urutan Waktu yang Dimodifikasi?

Saya ingin menggabungkan file pdf dengan pdfjoin /pdfunite /… dalam urutan numerik dibahas dengan baik di utas answer perintah linux menggabungkan file pdf dengan pengurutan numerik dan Dimodifikasi urutan waktu.
Jika Anda menggunakan solusi di utas, itu menempatkan urutan dalam urutan numerik dan urutan abjad.
Ini bermasalah dengan nama file seperti di mana Anda melihat keduanya memiliki waktu yang sama Dimodifikasi oleh akurasi menit tetapi Visceral lebih awal dengan akurasi kedua (Browser file mencatatnya dan menempatkan Visceral pertama di Modified pesan.

Filename               Modified
-----                  ---
3.THE ABC.pdf          10:39 
3.Visceral abc..pdf    10:39

Nama file lengkap

1.Description abc.pdf
2.Gabcd.pdf
3.THE ABC.pdf
3.Visceral abc..pdf
4.description of abc.pdf
5.Chraa..pdf

Proposal #1 bekerja dalam urutan numerik dan abjad tetapi tidak dalam urutan numerik dan dimodifikasi

# https://stackoverflow.com/a/23643544/54964
ls -v *.pdf | ...
    bash -c 'IFS=$'"'"'\n'"'"' read -d "" -ra x;pdfunite "${x[@]}" output.pdf'

Proposal #2 kasus yang disederhanakan tetapi tidak menangani spasi putih dan karakter khusus lainnya dalam nama file

# https://stackoverflow.com/a/23643544/54964
pdfunite $(ls *.pdf | sort -n) output.pdf

Tidak ada apa pun di pdfunite --help tentang pemesanan jadi saya pikir itu harus dilakukan oleh ls /sort /…
Perintah sort tidak memiliki apa-apa tentang modified di halaman manualnya.

Menguji jawaban xhienne

Urutan tidak benar pada output di mana Anda melihat 2.jpg dan 4.jpg berada di urutan yang salah untuk beberapa alasan

[email protected]:~/Documents$ ls -tr /home/masi/Documents/[0-9]* | sort -t. -k1,1n -s
//eadn-wc01-5196795.nxedge.io/home/masi/Documents/1.jpg
//eadn-wc01-5196795.nxedge.io/home/masi/Documents/3.jpg
//eadn-wc01-5196795.nxedge.io/home/masi/Documents/5.jpg
//eadn-wc01-5196795.nxedge.io/home/masi/Documents/6.jpg
//eadn-wc01-5196795.nxedge.io/home/masi/Documents/7.jpg
//eadn-wc01-5196795.nxedge.io/home/masi/Documents/8.jpg
//eadn-wc01-5196795.nxedge.io/home/masi/Documents/9.jpg
//eadn-wc01-5196795.nxedge.io/home/masi/Documents/10.jpg
//eadn-wc01-5196795.nxedge.io/home/masi/Documents/2.jpg
//eadn-wc01-5196795.nxedge.io/home/masi/Documents/4.jpg

iterasi ke-2

export LC_ALL=C; ls -tr /home/masi/Documents/[0-9]* | sort -t. -k1,1n -s

Keluaran

//eadn-wc01-5196795.nxedge.io/home/masi/Documents/1.jpg
//eadn-wc01-5196795.nxedge.io/home/masi/Documents/3.jpg
//eadn-wc01-5196795.nxedge.io/home/masi/Documents/5.jpg
//eadn-wc01-5196795.nxedge.io/home/masi/Documents/6.jpg
//eadn-wc01-5196795.nxedge.io/home/masi/Documents/7.jpg
//eadn-wc01-5196795.nxedge.io/home/masi/Documents/8.jpg
//eadn-wc01-5196795.nxedge.io/home/masi/Documents/9.jpg
//eadn-wc01-5196795.nxedge.io/home/masi/Documents/10.jpg
//eadn-wc01-5196795.nxedge.io/home/masi/Documents/2.jpg
//eadn-wc01-5196795.nxedge.io/home/masi/Documents/4.jpg

OS:Debian 8.5

Jawaban yang Diterima:

Anda bisa melakukannya dengan zsh :

zmodload zsh/stat

prefixmtime () {
sortstring=${(l:6::0:)${REPLY%%.*}}$(zstat -F '%s' +mtime -- $REPLY)
REPLY=${sortstring}
}

print -rl -- *(o+prefixmtime)

Ganti print -rl dengan perintah Anda jika Anda senang dengan hasilnya

Cara kerjanya:
Gumpalan akan diurutkan di sini (melalui o+function ) berdasarkan apa fungsinya prefixmtime kembali, yaitu sortstring yang merupakan string yang diperoleh dengan menggabungkan awalan numerik dari setiap nama file ${REPLY%%.*} diisi kiri dengan nol (l:6::0:) (dengan asumsi awalan memiliki panjang hingga 6 karakter) dan mtime dalam hitungan detik (diperoleh melalui zstat modul). Mungkin lebih mudah untuk memahami cara kerjanya jika Anda menjalankan:

{ for f (*)
printf '%s %s\n' ${(l:6::0:)${f%%.*}}$(zstat -F '%s' +mtime -- $f) $f
} | sort -k1,1n

Perhatikan bahwa hal di atas mengasumsikan Anda berada di direktori yang sama dengan file Anda, jika tidak, Anda harus menentukan string pengurutan dalam fungsi itu sebagai

sortstring=${(l:6::0:)${${REPLY##*/}%%.*}}$(zstat -F '%s' +mtime -- $REPLY)

dan kemudian Anda dapat menggunakan jalur direktori mis.

print -rl some/place/else/*(o+prefixmtime)

Linux
  1. Cara memindahkan /usr dan /var ke Partisi atau Disk Lain

  2. Instal binari ke /bin, /sbin, /usr/bin dan /usr/sbin, interaksi dengan --prefix dan DESTDIR

  3. Kapan saya harus menggunakan /dev/shm/ dan kapan saya harus menggunakan /tmp/?

  1. Linux:Perbedaan antara /dev/console , /dev/tty dan /dev/tty0

  2. Bagaimana Linux menggunakan /dev/tty dan /dev/tty0

  3. Bagaimana mengubah default /tmp ke /home/user/tmp

  1. Linux:Perbedaan Antara /dev/console , /dev/tty Dan /dev/tty0?

  2. Cara menggunakan wget untuk mengunduh file melalui proxy

  3. Bagaimana cara mengetahui dari folder mana suatu proses sedang berjalan?