【问题标题】:Show file sizes with names that contain spaces [duplicate]显示名称包含空格的文件大小[重复]
【发布时间】:2018-11-09 06:26:35
【问题描述】:

我试图通过显示文件大小的目录运行,但是当我尝试打印包含空格的文件的大小时,stat 命令失败。我该如何解决这个问题?

#!/bin/bash

    for file in /home/user/Desktop/*; do
        fileSize=$(stat -c%s $file)
        echo $fileSize
    done

【问题讨论】:

  • 只需stat -c%s /home/user/Desktop/* 会做你想做的事;但是无论如何打印没有文件名的大小是没有用的。可能在格式字符串中包含文件名。

标签: linux bash file


【解决方案1】:

使用引号。

#!/bin/bash
for file in /home/user/Desktop/*; do
    fileSize=$(stat -c%s "$file")
    echo $fileSize
done

针对我的桌面进行了调整 -

$: for file in *
   do case "$f" in
      *\ *) printf "'$f': %d\n" $(stat -c%s "$file")
      esac
   done
'BPS Stuff': 0
'New TWC Account -  Hodges  Paul A.msg': 37888
'Nov FTOTD calendar.JPG': 138769
'OCA Web Client - ASAP.lnk': 2406
'Paul - Copy.png': 64915
'Solstice Client.lnk': 2165
'VIP Access.lnk': 2079

【讨论】:

    【解决方案2】:

    您应该在变量周围添加引号,以确保其中是否有空格可以正确提取:

    #!/bin/bash
    
    for file in /home/user/Desktop/*; do
        fileSize=$(stat -c%s "$file")
        echo $fileSize
    done
    

    bash 所做的只是简单地将 $var 替换为 $var 中的内容。如果其中包含空格,则它会变成您想要的其他内容,因为在 bash 中使用空格来分隔命令选项。

    考虑以下示例:

    file="-l -h -a -F"
    ls $file
    

    这被解析为:

    ls -l -h -a -F
    

    输出不会只是文件“-l -h -a -F”,而是会被解析为 ls 的选项,并显示当前目录列表。如果你像这样在 $file 周围加上引号:

    file="-l -h -a -F"
    ls "$file"
    

    它将被解析为:

    ls "-l -h -a -F"
    

    ls 将搜索文件“-l -h -a -F”并仅显示一个文件(假设它存在,否则会出错)。

    【讨论】:

      猜你喜欢
      • 2012-09-30
      • 2023-04-01
      • 2011-11-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多