禁止来自“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 上就是这样); Linux上可以考虑使用stat -L -c %s "$file"代替,保证不需要读取整个文件),测试是否是普通文件,如果不是则跳过:

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

测试-f将是真的如果该文件是常规文件或常规文件的符号链接。如果整个测试为真(文件不是常规文件或一行),则测试被否定!,并且执行语句,跳到循环的下一次迭代。continue


请注意,您需要$file在调用中使用双引号rm,否则如果给定的参数包含空格、制表符或换行符,脚本将执行错误的操作。如果任何文件名包含文件名通配符(例如,如果文件名为*),它还会删除超出您预期的内容。

您还需要--在参数前面使用才能成功删除名称以破折号开头的文件:

rm -- "$file"

另外,对于shift单个参数,您只需要shift.

并使用exit 1错误退出。目前尚不清楚为什么您可以在此处打印到日志文件,而您可以打印到标准错误(使用>&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

相关内容