変更時間に基づいてファイルを並べ替える

変更時間に基づいてファイルを並べ替える

ここでは、次の構造を使用する多くの質問と回答を見ました。

list_dir=`ls -t /path/to/dir/`
for i in $list_dir; do

または

ls -t | while read i; do

今私はあなたを知っていますlsはスクリプトに使用しないでください。簡単に壊れるため、最後に変更されたものから最後に変更されたものの順に(またはその逆)ファイルを操作するより良い方法が見つかりません。

次のようなものを使用できます。

find . -type f -printf '%T@ %p\n' | sort -n | cut -d ' ' -f 2- | while read i; do...

...しかし、名前に改行が含まれているファイルはまだ破損し、起動が悪くなります。もっと良い方法がありますか?

答え1

「スクリプトでlsを使用しないでください」は、POSIX ls「only」の問題です。 GNU lsを参照してください--quoting-style=

GNUソートはこの問題を解決します--zero-terminated

互換性が必要な場合は、find ... -execエスケープを実行するスクリプトにファイル名を一度に1つずつ渡すことができます。少なくともbashが利用可能な場合:

start cmd:> testfunc () { echo "${1//$'\n'/\n}"; }
start cmd:> testfunc a$'\n'b
a\nb

答え2

最も簡単な方法はzshを使用することです。これグローバル予選 omOm時系列で使用される逆順で一致をソートします。

for x in /path/to/dir/*(Nom); do …

ディレクトリが空の場合、glob修飾子はパターンをN空のリストに展開します。*(DNom)ドットファイルと一致するようにしてください。

関連情報