无法统计包含空格的文件名

无法统计包含空格的文件名

我对 shell 脚本和为项目编写脚本非常陌生。我在对文件名执行“stat”以检查大小时遇到​​问题,文件名中有空格。问题是我无法直接编写命令,首先我必须将其存储在变量中,然后我必须通过该变量执行它。例如,我的脚本是:

##test.sh
###Start
OIFS=$IFS

IFS=$'\n'

filename=$1

a=stat
b=-c  
c=%s
d=${filename}

CMD="$a $b $c $d"

result=`$CMD`

echo "Size is:"$result

IFS=$OIFS
###END

我已设置 IFS=$'\n' 来将其中包含空格的文件名作为参数传递。当我执行它时,我得到:

[root@abhargava ~]# ./test.sh dirLevel1/file\ Level1.txt
./test.sh: line 9: stat -c %s dirLevel1/file Level1.txt: No such file or directory
Size is:

由于 IFS,我认为 shell 将命令视为一个单元,而不会将其拆分成多个部分,如果我删除 IFS 的设置,那么它会说:

[root@abhargava ~]# ./test.sh dirLevel1/file\ Level1.txt
stat: cannot stat `dirLevel1/file': No such file or directory
stat: cannot stat `Level1.txt': No such file or directory
Size is:

因此它将参数视为两个不同的文件。我不能使用“$@”,因为我从其他列出目录中文件的逻辑中获取文件名,例如

for i in 'find ${arg} -type f'
do
calling the test.sh
done

请尽快帮助我..!!提前谢谢....!!

答案1

答案2

我同意 Ignacio 的观点,保持 Bash 脚本简单是最好的方法。从那以后,我简化了脚本以允许它处理空格。为了允许它处理空格,将文件名括在引号中允许脚本处理文件名中的空格。

##test.sh
###Start

result=`stat -c %s "$1"`

echo "Size is:"$result

###END

答案3

我意识到这是一个老话题,但我找到了一篇很好的文章,它解决了将文件名输入 stat 时出现的问题。也就是说,您需要将 xargs 与 -d 标志(用于分隔符)一起使用,以指定除空格之外的其他分隔符。当我将分隔符指定为换行符 '\n' 时,它对我有用!

感谢这篇文章:https://shapeshed.com/unix-xargs/

相关内容