该脚本应该打印出目录中 100 字节以下的所有文件的文件大小和名称。我编写的这个脚本在我的 Ubuntu 上完美运行,但在我的 Mac OS Lion 上不起作用。谁能告诉我为什么?
#!/bin/bash
for i in $(ls)
do
if [[ $(wc -c $i | cut -d" " -f1) -le 100 ]]; then
echo $(wc -c $i)
fi
done
答案1
哇。看起来你让这件事变得比原来更加困难:
find . -size -100c -exec stat -c "%s : %n" {} \;
完毕。
答案2
参见这篇文章:嵌套 bash if/and/or 语句从 OS X 到 Ubuntu 不起作用
Ubuntu 使用dash
,我不确定您bash
在 OSX 上使用什么。将其放在顶部以确保您在两个系统上使用相同的 shell:
#! /usr/bin/env bash
-或者-
#!/bin/bash
您还可以echo $SHELL
从命令行查看您正在使用的 shell。使用bash
脚本,您可以通过在顶部添加此行来打开调试:
set -x
例如
% ls -l
total 4
-rw-rw-r-- 1 saml saml 0 Jan 30 20:30 a1
-rw-rw-r-- 1 saml saml 0 Jan 30 20:30 a2
-rwxrwxr-x 1 saml saml 151 Jan 30 20:45 a.bash
% ./a.bash
0 a1
0 a2
启用 set -x 后
% ./a.bash
++ ls
+ for i in '$(ls)'
++ wc -c a1
++ cut '-d ' -f1
+ [[ 0 -le 100 ]]
++ wc -c a1
+ echo 0 a1
0 a1
+ for i in '$(ls)'
++ wc -c a2
++ cut '-d ' -f1
+ [[ 0 -le 100 ]]
++ wc -c a2
+ echo 0 a2
0 a2
+ for i in '$(ls)'
++ wc -c a.bash
++ cut '-d ' -f1
+ [[ 123 -le 100 ]]
资源
答案3
重构为使用单个外部进程:
for i in *; do
wc=$(wc -c <"$i")
case $wc in 100 ) ;; ???* ) continue ;; esac
echo "$wc $i"
done
请注意引用,使用重定向来避免需要cut
,以及使用通配符模式来利用任何具有三位数或更多位数的数字大于或等于 100 的事实。
(你的代码说小于或等于100,而问题描述确实小于100;100) ;;
如果你的代码是错误的,而你提出的问题是正确的,你可以把这个案例去掉。)
请注意,wc -c
计算的是字符数,而不是字节数;对于可变长度或多字节编码(例如 Unicode)的文本,它们是不同的。