在 "for each" 块内的 shell 脚本中引用文件名

Reference a file name in shell script inside of a "for each" block

我有一个任务想要添加更多自动化。基本上,我将有一个目录,其中包含数量不等的以字母 x 开头的文件。我想 运行 每个文件的脚本,然后将文件移动到 "completed" 文件夹中。

我只想遍历以 "x" 作为文件名起始字符的文件,然后在另一个位置使用该文件名作为输出文件名的一部分。

大致如下:

for each (files beginning with x)
  cat (filename) | xargs ./script.sh > result-(filename);
  mv (filename) complete/;
  mv result-(filename) complete/;
end for each

每次出现这种情况时,我都会手动扩展一个 shell 脚本,并将其大小调整为我拥有的文件数量,但我确信我所要求的是可能的。

for f in x*; do
  xargs ./script.sh <"$f" >"result-$f"
  mv "$f" result-"$f" complete
done

注意事项:

  • cat 是 "concatenate" 的缩写。如果您没有连接多个文件,或未修改地在屏幕上显示单个文件的输出,则它可能不是适合该工作的工具:将文件直接连接到所需工具的输入比启动额外的工具更有效程序只读取单个文件并将该程序的标准输出连接到下一个程序的标准输入。

    换句话说:<filenamefilename 上的只读句柄连接到当前命令的标准输入 (FD 0)。 cat filename | 启动 一个单独的程序,该程序从 filename 读取并写入其标准输出,该标准输出连接到管道下一个组件的标准输入。

  • mv 可以接受多个源参数;将多个文件移动到同一目的地时,无需多次调用它。

  • x* 是一个扩展为文件名列表的 "glob expression";有关详细信息,请参阅 the wooledge wiki
  • 只要语法允许,未转义的换行符就会终止命令;因此,不需要终端 ;s.
  • shell中的引用是逐个字符评估的; "result-$f" 等同于 result-"$f",两者都实现了确保名为 f 的变量扩展发生在既不对结果执行字符串拆分也不执行 glob 扩展的上下文中的目标.