Надежный путь к identiry все потомки процесса состоит в том, чтобы использовать команду pstree
где pid является Вашим идентификатором родительского процесса.
Прочитайте страницу справочника на pstree
здесь.
Сигнализировать всем членам группы процесса: killpg(
где pgrp является числом группы процесса, и сигнал является сигналом.
Ожидать детей в указанной группе процесса: waitpid(-
Альтернатива тому, что Вы делаете, должна выполнить Ваш контейнер процесса в новой оболочке удара. Создайте новую оболочку удара с командой bash
и затем выполненный Ваши процессы. Когда Вы хотите, чтобы все процессы были закончены, вышли из оболочки с командой exit
.
Можно найти информацию ${...}
замены в странице справочника Вашей оболочки, например, колотите (1). Наиболее распространенное:
${var#word}
удалите самый короткий префикс: значение переменной var
с word
префикс (если таковые имеются) удаленный;
${var%word}
удалите самый короткий суффикс: значение переменной var
с word
суффикс удален (если таковые имеются).
${var/pattern/replacement}
удалите первое вхождение шаблона
${var//pattern/replacment}
удалите все случаи шаблона
Так, в Вашем примере ${f#image}
расширяется до значения f
(например, image01.png
) удаление image
префикс, таким образом, это приводит к значению 01.png
.
word
и replacement
часть в ${...}
расширения подвергаются тем же подстановочным расширениям как имена файлов; поэтому, если Вы хотите удалить пробелы и -
, Вы могли использовать ${f//[ -]/}
(замены любое возникновение символов и
-
с пустой строкой.
Все детали о странице справочника.
Если у Вас есть жемчуг rename
(например, потому что Вы находитесь на Debian или Ubuntu), это - самый простой способ освежевать эту конкретную кошку (как у отдельной кошки — существует много инструментов для массового переименования, и поиск архивов этого сайта и Суперпользователя должен найти все главные).
rename 's/[- ]//g' *.xml
Однако Ваш сценарий работал бы, если бы Вы следовали за самым важным принципом программирования оболочки: все подстановки переменных должны быть дважды заключены в кавычки. (Почему Вам нужен этот дополнительный бит пуха синтаксиса? Поскольку существуют случаи, где Вы на самом деле хотите неупомянутое поведение. Но эти случаи довольно редки.)
for f in *.xml; do mv "$f" "${f//[ -]/}"; done
С zsh Вы не должны были бы писать цикл: Вы могли использовать удобное zmv
функция.
autoload zmv
zmv '(*.xml)' '${1//[- ]/}'
Вы могли бы также использовать sed для создания нового имени. Там это было бы
for i in *.xml; do mv "$i" `echo "$i" | sed -e "s/[ -]//g"`; done
for i in *.xml; do mv "$i" $(echo "$i" | sed -e "s/[ -]//g"); done
– user unknown
10.02.2011, 11:31
MeasurementsPanama20090322Session10.xml' is not a directory mv: target
MeasurementsPanama20090322Session1.xml' не является каталогом – Vass 19.10.2010, 19:32$f
разделить словаMeasurements
,Panama
, и т.д. и таким образом сделайтеmv
думайте, что Вы хотите переместить файлыMeasuremens
,Panama
, и т.д. в синглMeasurementsPanama...
который должен затем быть каталогом. Использоватьfor f in *.xml; do mv "$f" "${f//[ -]/}"; done
вместо этого. (См. ответ Жабр также.) – Riccardo Murri 20.10.2010, 00:37