2016-02-01 42 views
0

我有一个任务,我想添加更多的自动化。基本上,我将有一个目录,其中有一个以字母x开头的不同数量的文件。我想对这些文件中的每一个运行脚本,然后将文件移动到“已完成”文件夹中。在“为每个”块中引用shell脚本中的文件名

我只想循环浏览具有“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脚本,并调整其大小来到底有多少文件,我有,但我知道我我问的是可能的。

+0

StackOverflow不是一个“请写一个脚本给我”请求的论坛。请考虑从语言教程开始,即。 http://mywiki.wooledge.org/BashGuide –

+0

你有'(用x开始的文件)'使用'x *'。至于for循环的语法,请参阅http://tldp.org/HOWTO/Bash-Prog-Intro-HOWTO-7.html – cdarke

回答

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

点注意事项:

  • cat是短期的 “串连”。如果您没有连接多个文件,或将单个文件的输出显示在未修改的屏幕上,则可能不是正确的工具:将文件直接连接到所需工具的输入比启动额外文件效率更高程序除了读取单个文件并将该程序的stdout连接到下一个程序的stdin之外什么都不做。

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

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

  • x*是一个“glob表达式”,它扩展为一个文件名列表;有关更多详细信息,请参见the wooledge wiki
  • 只要语法允许,非转义的换行符就终止命令;因此,不需要终端;
  • shell中的引用是逐字符评估的; "result-$f"相当于result-"$f",两者均实现确保名称为f的变量扩展发生在对结果执行字符串拆分或glob扩展的上下文中的目标。
+0

感谢您的详细解答!我很感谢:) –

+0

顺便说一句,如果你使用的是GNU版本(和支持扩展语法的bash等shell),请考虑xargs的'-d $'\ n''参数。否则,其中包含空格的行将导致多个调用,引号将不会被直接处理,等等。 –

+0

结果文件可以直接生成到'complete'目录,因此您不必单独移动它。 – tripleee

相关问题