Scénario:
Un dossier dans le système Linux. Je veux parcourir tous les fichiers .xls d'un dossier.
Ce dossier est généralement composé de différents dossiers, de différents types de fichiers (.sh, .pl, .csv, ...).
Tout ce que je veux faire est de parcourir tous les fichiers de la racine et d'exécuter un programme uniquement sur des fichiers .xls.
Modifier :
Le problème est que le programme que je dois exécuter est 'xls2csv' pour convertir du format .xls au format .csv. Donc, pour chaque fichier .xls, je dois récupérer le nom du fichier et l’ajouter à .csv.
Par exemple, j'ai un fichier test.xls et les arguments de xls2csv sont: xls2csv test.xls test.csv
Ai-je du sens?
frapper:
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
La première ligne du do
vérifie si le fichier "correspondant" existe réellement, car si rien ne correspond dans votre for
, le do
sera exécuté avec "* .xls "comme $i
. Cela pourrait être horrible pour votre xls2csv
.
Regardez la commande trouver .
Qu'est-ce que vous recherchez est quelque chose comme
find . -name "*.xls" -type f -exec program
Posté
find . -name "*.xls" -type f -exec xls2csv '{}' '{}'.csv;
va exécuter xls2csv file.xls file.xls.csv
Plus près de ce que vous voulez.
find . -type f -name "*.xls" -printf "xls2csv %p %p.csv\n" | bash
bash 4 (récursif)
shopt -s globstar
for xls in /path/**/*.xls
do
xls2csv "$xls" "${xls%.xls}.csv"
done