Scenario :
A folder in Linux system. I want to loop through every .xls file in a folder.
This folder typically consists of various folders, various filetypes (.sh, .pl,.csv,...).
All I want to do is loop through all files in the root and execute a program only on .xls files.
Edit :
The problem is the program I have to execute is 'xls2csv' to convert from .xls to .csv format. So, for each .xls file I have to grab the filename and append it to .csv.
For instance, I have a test.xls file and the argumen开发者_运维知识库ts fro xls2csv are : xls2csv test.xls test.csv
Did I make sense?
bash:
for f in *.xls ; do xls2csv "$f" "${f%.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
.
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.
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
精彩评论