変更時間でファイルをソートする


8

私はここで多くの質問と回答を見て、

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

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

GNU sortはで問題を解決し--zero-terminatedます。

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

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

あー、--zero-terminatedありがとうございます。もっとポイントをあげたいです!
evilsoup 2013年

... OK、私は少し混乱していinfo lsます。ls --quoting-styleを使用した防弾スクリプトが必要な場合、どちらを使用すればよいですか?
evilsoup 2013年

@evilsoupを--quoting-style=escape選択する方法だと思います。
Hauke Laging 2013年

次に、名前に改行を含むいくつかのファイルを作成してテストします:P
evilsoup

1
また、ls --quoting-styleファイル名のみを引用するため、GNU が(解析目的で)失敗するという極端なケースに遭遇します。OK、それは非常に悲惨なケースですが、cygwin bashシェルで発生しますDomain Users。ここでは、のようなグループ名があります。
DavAlPi 2013年

4

最も簡単な方法は、zshを使用することです。グロブ修飾子は、 om新しい順に試合をソートします。Om年代順に使用します。

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

Nグロブ修飾子は、ディレクトリが空の場合、空のリストに展開したパターンが発生します。*(DNom)ドットファイルと一致するようにこれを作成します。


1
ダン、これは私が他のシェルをわざわざ見たくなりたくて初めてです-それはとてもいいです。
evilsoup 2013年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.