ユーザーがディレクトリ名を入力するたびにこのエラーを表示するスクリプトがあります。
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 message
variable