Files

如何按數字順序和修改的時間順序對文件名進行排序?

  • December 30, 2016

我想加入 pdf 文件 by pdfjoin/ pdfunite/… 以線上程答案linux 命令中討論的數字順序合併 pdf 文件與數字排序修改的時間順序。如果您線上程中使用解決方案,它將按數字順序和字母順序排列順序。這對於文件名是有問題的,例如您看到兩者俱有相同的按分鐘精度修改的時間,但Visceral按秒精度更早(文件瀏覽器注意到它並按順序排Visceral在第一位Modified

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

完整的文件名

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

提案 #1 按數字和字母順序工作,但不按數字和修改順序

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

提案 #2 簡化了大小寫,但不處理文件名中的空格和其他特殊字元

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

關於排序沒有任何pdfunite --help內容,所以我認為應該由ls/ sort/… 完成該命令的手冊頁sort中沒有任何內容modified

測試 xhienne 的答案

您看到的輸出中的順序不正確,2.jpg並且4.jpg由於某種原因處於錯誤的順序

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

第二次迭代

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

輸出

/home/masi/Documents/1.jpg
/home/masi/Documents/3.jpg
/home/masi/Documents/5.jpg
/home/masi/Documents/6.jpg
/home/masi/Documents/7.jpg
/home/masi/Documents/8.jpg
/home/masi/Documents/9.jpg
/home/masi/Documents/10.jpg
/home/masi/Documents/2.jpg
/home/masi/Documents/4.jpg

作業系統:Debian 8.5

你可以這樣做zsh

zmodload zsh/stat

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

print -rl -- *(o+prefixmtime)

print -rl如果您對結果滿意,請替換為您的命令


工作原理: glob 將根據函式返回的內容在

此處排序(通過),即通過連接每個文件名的數字前綴獲得的字元串,左填充零(假設前綴最長為 6 個字元) )以秒為單位的(通過模組獲得)。如果你執行它可能更容易理解它是如何工作的:o+functionprefixmtime``sortstring``${REPLY%%.*}``(l:6::0:)``mtimezstat

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

請注意,以上假設您與文件位於同一目錄中,否則您必須在該函式中定義排序字元串為

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

然後你可以使用目錄路徑,例如

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

引用自:https://unix.stackexchange.com/questions/332348