for x in /path/to/source/**/*.ext1; do convert $x ${x:r}.ext2 done
r
в${x:r}
модификатор истории. Существует краткая формаfor
это сохраняет несколько символов.for x (/path/to/source/**/*.ext1) convert $x ${x:r}.ext2
У Вас все еще есть многочисленные проблемы в Вашем сценарии.
Прежде всего текстовый редактор является правильным способом создать сценарий 99% времени. Создание его вручную линию за линией с командами эха утомительно и не предлагает преимущества вообще. (Другой 1% покрывает случаи, где Вы находитесь в системе, которая не имеет редактора, Вы знакомы с, или где существует серьезное основание использовать программу для генерации сценария автоматически, ни один из которых не должен применяться в случае.)
Первая строка должна быть #!/bin/tcsh -f
, нет #!/bin/tcsh
. -f
говорит этому не получать Ваши файлы запуска (.tcshrc
, .cshrc
, .login
), таким образом, Ваш сценарий будет автономным. Отсутствие -f
вероятно, не вызовет проблем, но наличие его является хорошей практикой. (Отметьте: это не относится sh
или bash
сценарии; для тех оболочек, -f
средства что-то еще полностью.)
Эта строка:
sed "s/_/-/g" $sql
чтения каждый файл, изменяя все символы нижнего подчеркивания на дефисы - но вывод записаны в stdout, не назад во входной файл. Сами файлы не изменяются. Так как Вы позже делаете это:
echo You changed $n files
Я предполагаю, что это не согласуется с Вашими планами.
Изменение файлов на месте на самом деле умеренно хитро. Я сделал бы что-то вроде этого:
sed "s/_/-/g" $sql > $sql.tmp && mv $sql.tmp $sql
Это изменяет файл $sql
, запись измененной версии во временный файл. Если это успешно выполняется, это затем переименовывает временный файл к $sql
.
Существует также a -i
опция к sed
это сделает что-то подобное; другой подход:
sed -i.bak "s/_/-/g" $sql
Добавление отступа является Вашим другом. Все между foreach
и end
строки должны быть расположены с отступом для показа структуры кода. (Я использую 4 пробелов сам; некоторые люди предпочитают другое количество пробелов или используют вкладки.)
Наконец, chmod 777 test
не должен быть в test
сам сценарий. Необходимо выполнить ту команду из командной строки, для создания test
исполняемый файл сценария. И 777
плохая идея; это делает Ваш сценарий читаемым, исполняемым, и перезаписываемым всеми в системе. Использовать chmod +x test
вместо этого.
Убедитесь, что Вы выполняете сценарий путем ввода ./test
, не просто test
. (Ваш вопрос говорит, что Вы уже делаете это.) Иначе Вы могли бы выполнить встроенное test
команда, а не Ваш сценарий. Нет ничего неправильно с именованием Вашего сценария test
, пока Вы (a) последовательно используете ./test
синтаксис для вызова его, и (b) Вы не имеете .
каталог в Вашем $PATH
.
Если Вы собираетесь быть записью большого количества сценариев, необходимо рассмотреть использование sh
или bash
вместо csh
или tcsh
. Это эссе объясняет почему.
Наконец (и это могло бы быть самым важным уроком здесь), Вы на самом деле не сказали нам, что Вы пытаетесь сделать. Я думаю, что Вы хотите изменить содержание определенных файлов, заменяя символы нижнего подчеркивания дефисами. Или Вы хотите изменить их имена, а не их содержание? Невозможно быть уверенным, что Вы пытаетесь сделать, потому что все, что Вы показали нам, является блоком кода, который не работает. Нет ничего неправильно с показом нам нерабочий код, но мы не можем советовать Вам, как зафиксировать его, если Вы не говорите нам на английском языке, что Вы пытаетесь выполнить.
Попытка, что Вы делаете из командной строки оболочки, чревата проблемами. Вы имеете к echo
и перенаправьте каждую строку, и необходимо заключить любые метасимволы оболочки в кавычки, чтобы они быть интерпретированными текущей оболочкой и не не превращают ее в файл, который Вы создаете. Вы - более обеспеченное использование текстового редактора для редактирования Вашего test
файл и ввод оболочки управляют непосредственно там.
tcsh
- сценарий стиля. Могло случиться так, что Вы непреднамеренно пытаетесь выполниться, это с Bourne вводит оболочку, например. bash
или sh
? Это объяснило бы сообщение об ошибке. Поместить #!/bin/tcsh
наверху файла, чтобы сказать системе использовать tcsh
как интерпретатор.
– Kyle Jones
06.03.2012, 21:35
Как предложено, используйте редактора для записи сценариев оболочки.
Здесь исправления к Вашей отредактированной версии:
Необходимо записать set n=0
вместо n=0
избавиться от "команды, не найденной" сообщение об ошибке,
foreach sql ( *_*.sql )
вместо foreach sql *_*.sql
и end
вместо End
.
Вам нужны нормальные кавычки "
вместо “
заключить параметры в кавычки для sed.
./test
, название сценария не должно было иметь никакого значения. Это, должно быть, было некоторое другое изменение, которое решило проблему. – Keith Thompson 07.03.2012, 21:19