【问题标题】:Shell script: Check that file is file and not directoryShell脚本:检查文件是文件而不是目录
【发布时间】:2011-06-15 19:27:07
【问题描述】:

我目前正在编写一个可爱的小 shell 脚本来循环遍历特定文件夹并仅输出其中的文件,不包括任何最终目录。不幸的是,我不能使用find,因为我需要访问文件名变量。

这是我当前的 sn-p,它不起作用:

for filename in "/var/myfolder/*"
do
  if [ -f "$filename" ]; then
    echo $filename # Is file!
  fi

done;

我做错了什么?

【问题讨论】:

    标签: bash file shell directory


    【解决方案1】:

    您不得转义 /var/myfolder/*,这意味着您必须删除双引号,以便 shell 将表达式正确扩展为所需的文件名列表。

    【讨论】:

      【解决方案2】:

      你做错了没有使用find。可以使用{}检索文件名。

      find /var/myfolder -maxdepth 1 -type f -exec echo {} \;
      

      【讨论】:

        【解决方案3】:

        尝试在 /var/myfolder/* 周围不使用双引号(原因是通过添加双引号,您可以将所有文件变成单个字符串,而不是每个文件名都是单独的字符串

        【讨论】:

        • 不,所有文件都不是单个字符串。它使星号文字并且它没有得到扩展。
        • 你是对的,它是一个字面星号,然后在 "echo $filename" 中展开
        【解决方案4】:

        for filename in "/var/myfolder/*"

        引号表示您从该 glob 中获得一个巨大的字符串 - 在 if 之前紧贴 echo _ $filename _ 以发现它只通过“循环”一次,并且没有用处。

        删除引号并重试:)

        【讨论】:

        • 这不是引号内的全局变量。星号是字面意思。
        • @Dennis Williamson,感谢您的更正;我假设因为echo 打印出shell 在分配之前扩展了星号的整个目录内容。我没有意识到 shell 在执行echo 时会扩展星号——感谢您修正了我的假设,两次错误。 :)
        【解决方案5】:

        您可以使用 find 并避免所有这些麻烦。

        for i in $(find /var/myfolder -type f)
        do
        echo $(basename $i)
        done
        

        这不是你想要解决的问题吗?如果要限制深度,请使用-maxdepth 选项查找。

        【讨论】:

        • 如果文件名包含空格,那么以这种方式使用forfind 将失败。使用find -execfind -print0 | xargs -0find | while IFS=$'\n' read -rwhile IFS=$'\n' read -r ... done < <(find)
        猜你喜欢
        • 2010-09-10
        • 2018-05-12
        • 1970-01-01
        • 2022-12-01
        • 1970-01-01
        • 1970-01-01
        • 2015-11-11
        • 2011-05-31
        • 2014-09-21
        相关资源
        最近更新 更多