Linux Shell Script Для каждого файла в каталоге Захватите имя файла и выполните программу

Сценарий:

Папка в системе Linux. Я хочу пропустить каждый файл .xls в папке.

Эта папка обычно состоит из различных папок, различных типов файлов (.sh,.pl,.csv,...).

Все, что я хочу сделать, - это цикл через все файлы в корневом каталоге и выполнить программу только в файлах .xls.

Изменить:

Проблема заключается в том, что программа, которую я должен выполнить, это "xls2csv" для преобразования из .xls в формат .csv. Итак, для каждого .xls файла мне нужно захватить имя файла и добавить его в .csv.

Например, у меня есть файл test.xls, а аргументы из xls2csv: xls2csv test.xls test.csv

Я имел смысл?

Ответ 1

bash:

for f in *.xls ; do xls2csv "$f" "${f%.xls}.csv" ; done

Ответ 2

Посмотрите на команду find.

То, что вы ищете, похоже на

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

Редактирование сообщений

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

выполнит xls2csv file.xls file.xls.csv

Ближе к тому, что вы хотите.

Ответ 3

for i in *.xls ; do 
  [[ -f "$i" ]] || continue
  xls2csv "$i" "${i%.xls}.csv"
done

Первая строка в do проверяет, действительно ли существует файл соответствия, потому что в случае, если в вашем for ничего не соответствует, do будет выполняться с "*.xls" как $i. Это может быть ужасно для вашего xls2csv.

Ответ 4

find . -type f -name "*.xls" -printf "xls2csv %p %p.csv\n" | bash

bash 4 (рекурсивный)

shopt -s globstar
for xls in /path/**/*.xls
do
  xls2csv "$xls" "${xls%.xls}.csv"
done