最近のファイルを繰り返す

最近のファイルを繰り返す

分析したいNループがあるディレクトリの最新ファイルですforls -tパイプを使って接続しようとしましたが、head -n<number_of_files>空白のあるファイルを使用しているので動作しません。

解析のみを実行するには、次のスクリプトをどのように変更する必要がありますか?N最新文書:

[ -n "$BASH_VERSION" ] && shopt -s nullglob

for f in *; do
    [ -e $f ] && echo $f || continue
done

sh互換性のあるソリューションを探しています。

ベストアンサー1

(un)setのチェックがあります$BASH_VERSION。これはおそらくあなたがあなたshに属するのではなく、それに属すると思っていることを意味しますbash。これを行うには、nullglobコードはとにかくこのケースを確認する必要があるため、これを省略できます。

n=10    # Process no more than this number of files

k=0
for f in *
do
    [ -f "$f" ] || continue
    k=$((k+1))

    # Do stuff with your files as "$f"
    :

    [ $k -ge $n ] && break
done
echo "Files processed: $k"

ちょうど使用したい場合は、いくつかの変更を行うことができます。bash

  • [[ ... ]]代わりに使用[ ... ]
  • k=$((k+1))使用。 。 。交換((k++))

文字列変数を使用するどこでも二重引用符を使用しています。これにより、その値がシェルによって解析され、スペースから単語に分割されるのを防ぎます。 (通常、変数を使用するときは二重引用符を使用するのが最善です。)


あなたの質問をもう一度読んで、あなたがNが欲しいことに気づきました。最近修正されました文書。 GNUツールを使用している場合は、それを使用してファイルリストを安全に生成できますが、指定しなかったためls。印刷されない文字や改行文字もありますがzsh

n=10    # Process no more than this number of files

k=0
ls -t |
    while IFS= read -r f
    do
        [ -f "$f" ] || continue
        k=$((k+1))

        # Do stuff with your files as "$f"
        :

        [ $k -ge $n ] && break
    done

GNU ツールでは、やや複雑なパイプラインを使用します。

find -maxdepth 1 -type f -printf "%T@\t%p\0" |    # Prefix numeric timestamp
    sort -z -k1,2rn |                             # Sort by the timestamp
    cut -z -f2- |                                 # Discard the timestamp
    head -z -n$n |                                # Keep only the top N files
    while IFS= read -r -d '' f
    do
        # Do stuff with your files as "$f"
        :
    done

おすすめ記事