Сценарий Linux Shell для каждого файла в каталоге. - PullRequest
70 голосов
/ 19 февраля 2010

Сценарий:

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

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

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

Редактировать:

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

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

Имеет ли я смысл?

Ответы [ 4 ]

178 голосов
/ 19 февраля 2010

Баш:

for f in *.xls ; do xls2csv "$f" "${f%.xls}.csv" ; done
12 голосов
/ 07 июня 2012
for i in *.xls ; do 
  [[ -f "$i" ]] || continue
  xls2csv "$i" "${i%.xls}.csv"
done

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

11 голосов
/ 19 февраля 2010

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

То, что вы ищете, это что-то вроде

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

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

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

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

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

3 голосов
/ 19 февраля 2010
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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...