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

目录中每个文件的Linux Shell脚本获取文件名并执行程序,linux,shell,Linux,Shell,情景: Linux系统中的文件夹。我想循环浏览文件夹中的每个.xls文件 此文件夹通常由各种文件夹、各种文件类型(.sh、.pl、.csv、…)组成 我所要做的就是循环根目录中的所有文件,并且只对.xls文件执行一个程序 编辑: 问题是我必须执行的程序是“xls2csv”,以便将.xls格式转换为.csv格式。因此,对于每个.xls文件,我必须获取文件名并将其附加到.csv 例如,我有一个test.xls文件,xls2csv的参数是:xls2csv test.xls test.csv 我说得通吗

情景:

Linux系统中的文件夹。我想循环浏览文件夹中的每个.xls文件

此文件夹通常由各种文件夹、各种文件类型(.sh、.pl、.csv、…)组成

我所要做的就是循环根目录中的所有文件,并且只对.xls文件执行一个程序

编辑:

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

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

我说得通吗?

看看命令

你要找的是

find . -name "*.xls" -type f -exec program 
后期编辑

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

更接近你想要的。

bash:

for f in *.xls ; do xls2csv "$f" "${f%.xls}.csv" ; done
bash4(递归)


do
中的第一行检查“匹配”文件是否确实存在,因为如果
for
中没有匹配项,那么
do
将以“*.xls”作为
$i
执行。这对于排除子文件夹的
xls2csv

find-maxdepth 1
来说可能非常糟糕。这也会将
test.xls
转换为
test.xls.csv
,而不是
test.csv
。所以这不是OP所要求的,但非常接近。使用
{}
作为参数的子字符串而不是整个参数是GNU扩展,POSIX规范不保证
查找
。因此,这个答案不一定可以移植到非GNU平台。简直太棒了!很好用!非常感谢你!这正是我寻找的一个完全不同的原因。稍微编辑一下,它非常适合我的特殊需要。谢谢=D,对于任何不清楚它的作用的人:${f%.ext}替换没有扩展名的文件名,因此在本例中,它将呈现为“filename.csv”而不是“filename.xls.csv”。嘿,我在谷歌上搜索了“LinuxForeach txt文件”,发现了这个。这正是我所需要的,我实际上试图使用xls2csv,但我想我找不到任何搜索结果:)$f的值为*.xls,如果*.xls与任何文件都不匹配。如果这是一个问题,请检查我的答案。或者您可以设置
nullglob
,以跳过循环。非常好的解决方案。我用它来编写haml/SCS,并在设计时为node.js项目构建html/css。如果你不相信你的文件名不包含像
$(rm-rf/)
这样的内容,这是非常危险的。。。或者只是空白。
find . -type f -name "*.xls" -printf "xls2csv %p %p.csv\n" | bash
shopt -s globstar
for xls in /path/**/*.xls
do
  xls2csv "$xls" "${xls%.xls}.csv"
done
for i in *.xls ; do 
  [[ -f "$i" ]] || continue
  xls2csv "$i" "${i%.xls}.csv"
done