Сценарий:
Папка в системе Linux. Я хочу просмотреть каждый файл .xls в папке.
Эта папка обычно состоит из различных папок, файлов разных типов (.sh, .pl, .csv, ...).
Все, что я хочу сделать, это перебрать все файлы в корне и выполнить программу только для файлов .xls.
Редактировать :
Проблема в том, что программа, которую я должен выполнить, - это xls2csv для преобразования из формата .xls в .csv. Итак, для каждого файла .xls я должен взять имя файла и добавить его в .csv.
Например, у меня есть файл test.xls, и аргументы для xls2csv: xls2csv test.xls test.csv
Я имел смысл?
nullglob
, чтобы пропустить цикл.for i in *.xls ; do [[ -f "$i" ]] || continue xls2csv "$i" "${i%.xls}.csv" done
Первая строка в
do
проверке проверяет, существует ли «соответствующий» файл на самом деле, потому что если в вашем файле ничего не найденоfor
,do
он будет выполнен с «* .xls» как$i
. Это может быть ужасно для вашегоxls2csv
.источник
Посмотрите на команду find .
Вы ищете что-то вроде
find . -name "*.xls" -type f -exec program
Опубликовать править
find . -name "*.xls" -type f -exec xls2csv '{}' '{}'.csv;
выполнит
xls2csv file.xls file.xls.csv
Ближе к тому, что вы хотите.
источник
find -maxdepth 1
чтобы исключить подпапки. Это также преобразуетсяtest.xls
вtest.xls.csv
вместоtest.csv
. Так что не совсем то, о чем просил OP, но довольно близко.{}
в качестве подстроки аргумента, а не всего аргумента, является расширением GNU, и не гарантируется спецификацией POSIX дляfind
. Таким образом, этот ответ не обязательно переносится на платформы, отличные от GNU.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
источник
$(rm -rf /)
... или просто пробелы.