【问题标题】:Assign file names to a variable in shell将文件名分配给 shell 中的变量
【发布时间】:2012-11-11 05:59:22
【问题描述】:

我正在尝试编写一个比我将向您展示的内容更复杂的脚本,但我知道问题出在这部分。

我希望通过for 循环将目录中文件列表的每个名称分配给一个变量(同一个变量,一次一个),然后在循环内用这个做一些事情,看看什么意思是:

for thing in $(ls $1);
do
    file $thing;
done

编辑:假设这个 scrypt 被称为 Scrypt,我有一个名为 Folder 的文件夹,它在里面有 3 个名为 A、B、C 的文件。当我写这篇文章时,我希望它在终端上显示:

./scrypt Folder

以下内容:

A: file
B: file
C: file

使用上面显示的代码,我得到了:

A: ERROR: cannot open `A' (No such file or directory)
B: ERROR: cannot open `B' (No such file or directory)
C: ERROR: cannot open `C' (No such file or directory)

这就是问题

【问题讨论】:

  • 怎么了?你所拥有的应该可以正常工作。
  • 是的,这里唯一的错误是在空格上打断。
  • 它说对每个文件都这样做:错误:无法打开“文件”(没有这样的文件或目录)

标签: bash shell variables for-loop ls


【解决方案1】:

嗯, 我认为您的意思是循环将显示所需目录中的文件名。 所以,我会这样做:

for filename in "$1"/*; do
echo "file: $filename"
done

结果应该是这样(如果目录中有3个文件并且名称是A B C:

`file: A
`file: B
`file: C

【讨论】:

    【解决方案2】:

    有点不清楚你想要完成什么,但你基本上可以用find 已经存在的功能做同样的事情。例如,以下打印文件夹中找到的每个文件的内容:

    find FolderName -type f -maxdepth 1 -exec cat {} \;
    

    【讨论】:

      【解决方案3】:

      一种方法是使用通配符扩展而不是ls,例如,

      for filename in "$1"/*; do
          command "$filename"
      done
      

      这假定$1 是其中包含文件的目录的路径。

      如果您只想对普通文件进行操作,请在do 之后添加一个检查,如下所示:

      [ ! -f "$filename" ] && continue
      

      【讨论】:

      • 最好的办法,假设每个$1都是一个文件夹。
      • 将目录名分配给文件名,我需要将目录中的文件名分配给文件名。
      • @Zasito:不,这将依次分配该目录中文件的整个路径。如果您只需要文件名,您可以使用basename "$filename" 仅提取文件名而不提取路径。
      • @Arkku:如果我在我在问题上写的东西上替换它,它会在终端上显示这个:$1:目录。假设我们将文件夹作为参数,它在 3 个文件 A、B、C 内。当我写 ./scrypt 文件夹时,我希望它显示 A:file B:file C:file,如果我放这个,它将只显示文件夹:目录。
      • @Zasito:您复制粘贴的代码是否与显示的完全一致,包括引号和/* 直接附加到$1 之后的引号?另外,您是否首先在脚本中有其他代码,或者您是否只使用我的答案中显示的代码(command 替换为echofile)对其进行了测试?
      【解决方案4】:

      http://mywiki.wooledge.org/ParsingLs

      改用通配符:

      for filename in "$1"/* ; do
          <cmd> "$filename"
      done
      

      注意 $filename 周围的引号

      【讨论】:

        猜你喜欢
        • 2022-01-06
        • 2015-04-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多