Escenario:
Una carpeta en el sistema Linux. Quiero recorrer cada archivo .xls en una carpeta.
Esta carpeta normalmente consta de varias carpetas, varios tipos de archivo (.sh, .pl, .csv, ...).
Todo lo que quiero hacer es recorrer todos los archivos en la raíz y ejecutar un programa solo en archivos .xls.
Editar:
El problema es que el programa que tengo que ejecutar es 'xls2csv' para convertir de formato .xls a .csv. Entonces, para cada archivo .xls, tengo que tomar el nombre del archivo y agregarlo a .csv.
Por ejemplo, tengo un archivo test.xls y los argumentos para xls2csv son: xls2csv test.xls test.csv
¿Tenía sentido?
nullglob
para omitir el ciclo.for i in *.xls ; do [[ -f "$i" ]] || continue xls2csv "$i" "${i%.xls}.csv" done
La primera línea de las
do
verificaciones si el archivo "coincidente" realmente existe, porque en caso de que nada coincida en sufor
,do
se ejecutará con "* .xls" como$i
. Esto podría ser horrible para tuxls2csv
.fuente
Mira el comando de búsqueda .
Lo que buscas es algo como
find . -name "*.xls" -type f -exec program
Publicado
find . -name "*.xls" -type f -exec xls2csv '{}' '{}'.csv;
ejecutará
xls2csv file.xls file.xls.csv
Más cerca de lo que quieres.
fuente
find -maxdepth 1
para excluir subcarpetas. Esto también se convierte entest.xls
entest.xls.csv
lugar detest.csv
. Así que no es exactamente lo que pidió OP, pero bastante cerca.{}
como una subcadena de un argumento en lugar de un argumento completo es una extensión GNU, no garantizada por la especificación POSIX parafind
. Como tal, esta respuesta no es necesariamente portátil para plataformas que no son GNU.find . -type f -name "*.xls" -printf "xls2csv %p %p.csv\n" | bash
bash 4 (recursivo)
shopt -s globstar for xls in /path/**/*.xls do xls2csv "$xls" "${xls%.xls}.csv" done
fuente
$(rm -rf /)
... o simplemente espacios en blanco.