「wc」で「該当するファイルやディレクトリがありません」というメッセージを抑制します。

「wc」で「該当するファイルやディレクトリがありません」というメッセージを抑制します。

ユーザーがディレクトリ名を入力するたびにこのエラーを表示するスクリプトがあります。 wc: standard input: is a director ユーザーがディレクトリに入るときにエラーメッセージを表示せずに無視する方法が必要です。

Limit="$1"
if [ -z "$1" ]; then
   echo 'no Arrgument'> err.log;
   exit 0 
fi
shift 1
for file in "$@"; do 
   SIZE="$(wc -c < "$file")"
   if [ "$SIZE" -gt "$Limiit" ]; then 
       echo "$file is $SIZE bytes. Deleting.."; 
       rm $file
   else
       echo " files is smaller then the Limte  delete"
   fi
done

答え1

呼び出す前にwc -cバイト数を数えます$file(ここでは潜在的に実装が非常にスマートでない限り(Linuxの場合)、ファイルサイズを取得する方法は非常に遅くなります。stat -L -c %s "$file"代わりに、ファイル全体を読み取る必要がないことを確認して使用することをお勧めします。通常のファイルで、そうでない場合はスキップします。

[[ ! -f $file ]] && continue

テストは-f次のとおりです。本物ファイルが一般ファイルまたは一般ファイルへのシンボリックリンクの場合。完全なテストが真の場合(ファイルが通常のファイルでも行でもない)、テストは無効になり、ステートメントが!実行され、ループの次の反復にジャンプされます。continue


参考にしてください必要$file呼び出し時に二重引用符を使用してくださいrm。それ以外の場合、指定された引数にスペース、タブ、または改行が含まれている場合、スクリプトは正しく機能しません。また、ファイル名にファイル名ワイルドカードが含まれている場合(たとえば、ファイル名名など)、意図したもの*より多くのものを削除します。

--また、名前がダッシュで始まるファイルを正常に削除するには、パラメータの前にを使用する必要があります。

rm -- "$file"

また、shift単一パラメータの場合shift

exit 1エラーで終了します。 stderrで印刷>&2してから(を使用して)スクリプトが呼び出されたときにスクリプトエラー出力をエラーログにリダイレクトできますが、ここでログファイルに印刷できる理由は不明です。


スクリプトを実装する別の方法:

#!/bin/sh

sz=${1:?Error: size is missing}
shift

[ "$#" -gt 0 ] && find -L "$@" -maxdepth 0 -type f -size +"$sz"c -delete

findこれはパラメータをテストして、そのファイルが特定のサイズより大きい通常のファイルであることを確認し、その場合は削除するために使用されます。この-maxdepth 0テストは、findコマンドが検索パス自体のみを考慮するのを防ぎます(ディレクトリにドロップダウンしません)。

欠落しているサイズパラメータのエラーメッセージは標準パラメータ置換によって処理され、指定された値が空であるか設定されていない場合は${variable:?error message}スクリプトが終了します。error messagevariable

関連情報