「検索」を使用せずにファイルサイズの下限と上限を表示

「検索」を使用せずにファイルサイズの下限と上限を表示

vimLinuxでというスクリプトを書く必要があります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:より良い
  • サイズを確認するにはstatduまたはを使用してください。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の他に他のシェルもあるので、構文と機能が異なるかもしれません。)

関連情報