我有这个脚本,每次如果用户输入目录的名称都会显示此错误,
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 message
variable