ファイル名を数値順と修正時系列で並べ替えるには?

ファイル名を数値順と修正時系列で並べ替えるには?

pdfjoin/ / ...を介してpdfuniteスレッドへの回答で説明されているように、PDFファイルを数値順に結合したいと思います。PDFファイルをマージして数値でソートするLinuxコマンドそして修正済み年代順に。スレッドでソリューションを使用している場合は、数字とアルファベット順に並べ替えられます。これはファイル名に問題があります。たとえば、両方とも同じ修正時間分精度で表示されますが、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...を介して行う必要があると思いました。sortmodified

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

2回目の繰り返し

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

ベストアンサー1

あなたはこれを行うことができますzsh

zmodload zsh/stat

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

print -rl -- *(o+prefixmtime)

print -rl結果に満足したら、コマンドに置き換えてください。


仕組み:
globはここでソートされています(以下を介して)。o+functionprefixmtime)関数が返す内容に応じて、sortstring左側の各ファイル名の数値プレフィックスを連結して得られた文字列です。${REPLY%%.*}パディング処理0を含む(l:6::0:)(プレフィックス長が最大6文字であると仮定)そしてmtime単位(次に獲得)zstat基準寸法)。次のコマンドを実行すると、これがどのように機能するかを理解するのが簡単になります。

{ 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)

おすすめ記事