【问题标题】:storing output of ls command consisting of files with spaces in their names存储 ls 命令的输出,其中包含名称中带有空格的文件
【发布时间】:2015-05-01 15:52:45
【问题描述】:

我想将 ls 命令的输出存储在我的 bash 脚本中的一个变量中,并在循环中使用每个文件名,但是例如,当我执行 variable=$(ls)“Hello " 和 "world" 最终成为两个单独的条目,当我尝试这样做时

for i in $variable
do
  mv $i ~
done

它显示文件“Hello”和“world”不存在的错误。 有什么方法可以访问当前目录中的所有文件并运行一些命令,即使这些文件的名称中有空格。

【问题讨论】:

    标签: linux bash filenames ls


    【解决方案1】:

    如果必须,dirfiles=(/path/of/interest/*)

    并接受反对解析ls的输出的警告!

    我了解您是新手,我愿意提供帮助。但对我(我们?)来说,以您提出问题的方式为您提供对您有很大帮助的答案并不容易。

    根据我目前听到的情况,您似乎对参数扩展在 shell 中的工作方式没有基本的了解。以下两个链接将对您有用: Matching Pathnames, Parameters

    现在,如果您手头的任务是对满足特定条件的文件进行操作,那么 find(1) 可能会完成这项工作。

    【讨论】:

      【解决方案2】:

      跟我说吧:don't parse the output of ls! 欲了解更多信息,请参阅this post on Unix.SE

      一个更好的方法是:

      for i in *
      do
          mv -- "$i" ~
      done
      

      或者干脆

      mv -- * ~
      

      【讨论】:

      • @mklement0 哎呀,对,不知道我是怎么错过的,考虑到这个问题是关于带空格的文件名:)
      • 如果想对当前目录中的文件运行命令,这可行,但我必须列出一个目录中的所有文件并将文件名与一些文本文件进行比较......所以存储在列表中可能变得必要,并且该目录也可能不是当前目录。此外,如果我尝试 s=("Hello world") 它将每个单词作为单独的条目。如何将一个句子存储在一个列表中的单个条目中?
      • 如果您有一个以- 开头的文件名,这将仍然失败。使用mv -- * ~
      猜你喜欢
      • 1970-01-01
      • 2012-01-28
      • 2022-01-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-10
      • 1970-01-01
      相关资源
      最近更新 更多