vim
Linuxでというスクリプトを書く必要がありますbetween
。このスクリプトは、ファイルサイズの下限と上限の2つのパラメータを使用してファイル名とサイズのリストを印刷します。ただし、このfind
コマンドを使用してこのスクリプトを完了することはできません。
私はこれをしました:すべてのファイルを表示しますが、そうでない特定のファイルは表示できないようですfind
。
#!/bin/bash
for i in *
do
set -- $(ls -l "$i")
echo $i: $5 bytes
done
答え1
あなたはできます:
範囲を確認するには、次の
if
ステートメントまたはcontinue
操作を使用できます。if [[ $z -ge $1 || $z -le $2 ]] then : print result fi
または
[[ $z -lt $1 || $z -gt $2 ]] && continue : print result
必要に応じてテストオプションは次のとおりです。
-ge
:異常-le
:以下-lt
:未満-gt
:より良い
サイズを確認するには
stat
、du
またはを使用してください。ls
後者の2つのケースでは、ターゲットがディレクトリか一般ファイルであるかを確認する必要があります。if [[ -f "$f" ]] then : a regular file fi
または入れ子になった if を防ぐには、次の手順を実行します。
! [[ -f "$f" ]] && continue
たとえば、ファイルサイズは次のようになります。
z=$(stat -c%s "$f") z=$(du -b "$f" | cut -f1) z=$(ls -l "$f" | cut -d' ' -f5)
結果を印刷するには、この機能を使用して
printf
よりきれいな印刷を得ることができます。つまり、固定サイズなどまた、これをお読みください。本当に親切になりたい場合は、主張も検証してみてください。
#!/bin/bash
usage()
{
printf "Usage: %s <min-size> <max-size>\n" "$0" >&2
exit 1
}
! [[ "$1" =~ ^[0-9]+$ ]] && usage
! [[ "$2" =~ ^[0-9]+$ ]] && usage
for f in *
do
z=$(stat -c%s "$f")
# Alternatives to get size:
# ! [[ -f "$f" ]] && continue
# z=$(du -b "$f" | cut -f1)
# z=$(ls -l "$f" | cut -d' ' -f5)
if [[ $z -ge $1 || $z -le $2 ]]
then
printf "%11d %s\n" "$z" "$f"
fi
done
答え2
for i in *
do
size=$(stat --format="%s" "$i")
if [ $size -gt $1 -a $size -lt $2 ]
then
printf "Right-sized: %s\n" "$i"
else
printf "Wrong-sized: %s\n" "$i"
fi
done
これはループの更新だけですが、lsを解析する代わりにstatを使用してファイルサイズをバイト単位で収集します。
このコードでは、$ 1と$ 2の完全性チェックがすでに行われていると仮定しています。私はこれをやりたくありません。みんなあなたのための宿題!
答え3
必要なのは、シェルで次の構文を使用する条件付きです。
if TEST
then
ACTION
else
ACTION
fi
テストに通常使用されます[
。たとえば、25より大きく50より小さいことを確認するには、$5
次のようにします。
if [ "$5" -gt 25 ] && [ "$5" -lt 50 ]
then
echo "It's greater than 25 but is less than 50"
else
echo "It's either <= 25, or >= 50, or not a number at all"
fi
引用符を忘れないでください(通知をいただいた@Wildcardに感謝します)。通過しないでください [
4つ以上のパラメータ(リンクを提供した@Jeff Schallerに感謝します。)
確認するBash初心者ガイドそして高度なバッシュスクリプトガイド、彼らは良い参考資料です。
(しかし、Bashの他に他のシェルもあるので、構文と機能が異なるかもしれません。)