web-dev-qa-db-fra.com

Script shell Linux pour chaque fichier d'un répertoire Saisissez le nom du fichier et exécutez un programme

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?

72
ThinkCode

frapper:

for f in *.xls ; do xls2csv "$f" "${f%.xls}.csv" ; done
181
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.

12
AndrewBourgeois

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.

11
Tom
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
3
ghostdog74