目录中每个文件的Linux Shell脚本获取文件名并执行程序


84

场景:

Linux系统中的文件夹。我想遍历文件夹中的每个.xls文件。

此文件夹通常由各种文件夹,各种文件类型(.sh,.pl,.csv等)组成。

我要做的就是循环遍历根目录中的所有文件,并仅对.xls文件执行程序。

编辑:

问题是我要执行的程序是将.xls转换为.csv格式的'xls2csv'。因此,对于每个.xls文件,我必须获取文件名并将其附加到.csv。

例如,我有一个test.xls文件,来回xls2csv的参数是: xls2csv test.xls test.csv

我说得通吗

Answers:


199

重击:

for f in *.xls ; do xls2csv "$f" "${f%.xls}.csv" ; done

就是棒!完美的作品!非常感谢!
ThinkCode 2010年

6
正是出于完全不同的原因,这正是我一直在寻找的东西。进行一些编辑,非常适合我的特定需求。谢谢= D对于尚不清楚其作用的任何人:$ {f%.ext}替换不带扩展名的文件名,因此在此示例中,它将渲染为“ filename.csv”而不是“ filename”。 xls.csv”。
弗鲁吉(Frungi)2012年

嘿,我用Google搜索了“ linux foreach txt文件”并找到了这个。这正是我所需要的,我实际上是在尝试使用xls2csv,但发现我找不到任何搜索结果:)
akiller

1
如果* .xls与任何文件都不匹配,则$ f的值为* .xls。检查我的答案是否有问题。
AndrewBourgeois

或者,您可以设置nullglob以跳过循环。
伊格纳西奥·巴斯克斯·阿布拉姆斯

15
for i in *.xls ; do 
  [[ -f "$i" ]] || continue
  xls2csv "$i" "${i%.xls}.csv"
done

第一行do检查“ matching”文件是否确实存在,因为如果您的文件中没有匹配的文件fordo则将使用“ * .xls”执行$i。这对您来说可能是可怕的xls2csv


13

查看find命令。

您正在寻找的是类似

find . -name "*.xls" -type f -exec program 

发布编辑

find . -name "*.xls" -type f -exec xls2csv '{}' '{}'.csv;

将执行 xls2csv file.xls file.xls.csv

接近您想要的。


find -maxdepth 1排除子文件夹。这也转换test.xlstest.xls.csv代替test.csv。因此,OP并不是完全想要的,而是非常接近。
短暂

使用{}GNU扩展作为参数的子字符串而不是整个参数,这是POSIX规范所不能保证的find。因此,此答案不一定可移植到非GNU平台。
Charles Duffy 2015年

4
find . -type f -name "*.xls" -printf "xls2csv %p %p.csv\n" | bash

bash 4(递归)

shopt -s globstar
for xls in /path/**/*.xls
do
  xls2csv "$xls" "${xls%.xls}.csv"
done

优秀的解决方案。我用它来编写haml / scss并在设计时为node.js项目构建到html / css中。
克里斯·肯普

1
如果您不信任文件名不包含诸如$(rm -rf /)...或仅包含空格之类的文件,这将是非常危险的。
查尔斯·达菲
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.