ここでは、次の構造を使用する多くの質問と回答を見ました。
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を使用することです。これグローバル予選 om
Om
時系列で使用される逆順で一致をソートします。
for x in /path/to/dir/*(Nom); do …
ディレクトリが空の場合、glob修飾子はパターンをN
空のリストに展開します。*(DNom)
ドットファイルと一致するようにしてください。