一次对多个文件运行bash命令

时间:2016-07-08 17:58:12

标签: bash terminal

我有一堆以数字结尾的文件(ex filename_01.txt,filename_02.txt等)。有没有办法在一次调用中对这些文件的子集运行bash命令?即伪代码:

SELECT * FROM customer 
WHERE date(CRTN_TS) between '2016-06-01' and '2016-06-30'
     and time(CRTN_TS) between '17:00:00' and '18:00:00' 

谢谢!

2 个答案:

答案 0 :(得分:2)

您可以使用括号来展开文件名:

cp filename_0[1-4].txt new_dir/

会将filename_01.txtfilename_02.txtfilename_03.txtfilename_04.txt复制到new_dir

答案 1 :(得分:2)

查看两种可以匹配文件的方法 - 一种是花括号,另一种是方括号。理解差异是很好的。

cp filename_0{1..4} new_dir/

这会扩展为四个文件名。在命令行前加上echo以查看您实际运行的内容。

cp filename_0[1-4] new_dir/

这会扩展到与模式匹配的所有现有文件。

这不是那么微妙的区别。在第一种情况下,如果缺少任何文件,您将看到错误。在第二种情况下,您的命令行将匹配所有存在的文件,但不要求它们存在。如果收到错误对您很重要(因为所有这些文件应该存在),请相应地选择您的方法。

请注意,大括号表示法(至少在bash版本4中)也可以处理增量,因此您可以执行以下操作:

$ echo file{10..30..4}
file10 file14 file18 file22 file26 file30

我应该指出[1-4]符号,虽然看起来它可能是正则表达式is not的一部分。它是Pathname Expansion的一部分,完全记录在bash手册页(man bash)中。当您处于阅读文档时,您应该阅读failglobextglob

我应该指出,这些情况都不会自己处理零填充。在您的示例中,以及到目前为止的答案(包括我的)中,数字都是手动填充零。如果你想要一种更灵活的方法,让你使用任意/未知数字的数字,你需要使用更高级的工具,大概是理解printf风格的格式。但这可能是另一个问题的答案。 : - )