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

场景:

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

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

我所要做的就是循环遍历 根目录中的所有文件并且只在.xls 文件上执行一个程序。

编辑:

问题是我必须执行的程序是“ xls2csv”来进行转换。Xls 到。Csv 格式。因此,对于每一个。我必须获取文件名并将其附加到 xls 文件。CSV.

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

我说的有道理吗?

167167 次浏览

Look at the find command.

What you are looking for is something like

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

Post edit

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

will execute xls2csv file.xls file.xls.csv

Closer to what you want.

bash:

for f in *.xls ; do xls2csv "$f" "${f%.xls}.csv" ; done
find . -type f -name "*.xls" -printf "xls2csv %p %p.csv\n" | bash

bash 4 (recursive)

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

The first line in the do checks if the "matching" file really exists, because in case nothing matches in your for, the do will be executed with "*.xls" as $i. This could be horrible for your xls2csv.