【问题标题】:Linux : check if something is a file [ -f not working ]Linux:检查某个东西是否是一个文件 [-f 不工作]
【发布时间】:2017-06-01 06:52:17
【问题描述】:

我目前正在尝试列出作为第一个参数传递给脚本的目录中所有文件的大小,但是 Linux 中的 -f 选项不起作用,或者我遗漏了什么。

代码如下:

for tmp in "$1/*"
do
  echo $tmp
  if [ -f "$tmp" ]
     then num=`ls -l $tmp | cut -d " " -f5`
       echo $num
  fi
done

我该如何解决这个问题?

【问题讨论】:

  • 您的输出是什么?它与您的预期有何不同?
  • 您是否缺少 if 语句后的分号。如果 [ -f "$tmp" ];然后..
  • @ThomasKühn 它回显了tmp 变量,但它甚至没有进入if 条件,因此它没有回显num 变量。
  • @SavoDebeljak:检查下面我的答案,错误是因为你有引用的 globbing,按照我的答案修复它
  • if 适合我。

标签: linux bash shell terminal


【解决方案1】:

我认为错误在于您的 glob 语法在单引号或双引号中都不起作用,

for tmp in "$1"/*; do
..

执行上述操作以将 glob 扩展到引号之外。

您的脚本可能还有更多改进,

  1. 双引号您的变量以防止分词,例如echo "$temp"
  2. 反引号命令替换 `` 是有几个问题的旧语法,请使用 $(..) 语法。

【讨论】:

  • @SavoDebeljak:这不是正确的方法,请单独引用$1,并在我的回答中省略 glob 模式。
【解决方案2】:

linux中的[-f "filename"]条件检查是用来检查一个文件是否存在,它是一个普通文件。供参考,以本文为参考,

    -b FILE
          FILE exists and is block special

   -c FILE
          FILE exists and is character special

   -d FILE
          FILE exists and is a directory

   -e FILE
          FILE exists

   -f FILE
          FILE exists and is a regular file

   -g FILE
          FILE exists and is set-group-ID

   -G FILE
          FILE exists and is owned by the effective group ID

我建议你尝试使用 [-e "filename"] 看看它是否有效。 干杯!

【讨论】:

  • 没有帮助
【解决方案3】:

至少在命令行上,这段脚本可以做到:

for tmp in *; do echo $tmp; if [ -f $tmp ]; then num=$(ls -l $tmp | sed -e 's/  */ /g' | cut -d ' ' -f5); echo $num; fi; done;

如果cut 使用空格作为分隔符,它会在每个空格符号处剪切。有时,列之间有多个空格,计数很容易出错。我猜在您的情况下,您只是碰巧echo 一个空格,看起来什么都没有。使用sed 命令,我删除了多余的空格。

【讨论】:

    猜你喜欢
    • 2022-08-24
    • 2012-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-11
    相关资源
    最近更新 更多