分析したいNループがあるディレクトリの最新ファイルですfor
。ls -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