web-dev-qa-db-ja.com

変更時間でファイルを並べ替える

私はここで多くの質問と回答を見てきました。

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...

...しかし、名前に改行が含まれているファイルでは、これは機能しなくなり、起動がはるかに醜くなります。より良い方法はありますか?

8
evilsoup

「スクリプトでlsを使用しない」は、POSIXls「のみ」の問題です。 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
8
Hauke Laging

これまでで最も簡単な方法は、zshを使用することです。 glob qualifieromは、一致を新しい順に並べ替えます。時系列にはOmを使用します。

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

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