Не непосредственно. Можно поставить капканы в коде так, чтобы можно было получить часть того, что ЦП делает в тот момент в коде, но Вы не можете на самом деле "видеть" то, в чем это выполняет в реальном времени.
находка сохранит Вас:
find /your/dir/with/subdirs -type d -exec sh -c 'cd "{}" ; /path/to/your/script.sh ;' \;
В Вашем сценарии существует несколько проблем.
cd $MainDir
Лучше сделайте это cd "$MainDir"
. Здесь это не важно, но это - хорошая привычка войти. Если Вы уезжаете, переменное расширение закрыло кавычки, значение переменной разделяется на слова, и каждое слово рассматривают как подстановочный шаблон оболочки; таким образом, эта команда перестала бы работать если $MainDir
содержавший пробел или \[?*
. Помещение двойных кавычек никогда не причиняет боль (если Вы не хотите разделить и соответствие имени файла для случая), и избегает этих дополнительных расширений. То же идет для замен команды ($(somecommand)
). Всегда помещайте двойные кавычки вокруг переменной и управляйте заменами, если Вы не знаете, что хотите разделить и соответствие имени файла.
for dir in $(ls); do
Не анализируйте вывод ls
. Вам почти никогда не нужно ls
в сценариях. Как объяснено выше, результат замены команды разделяется на слова, которые рассматривают как подстановочные шаблоны, таким образом, $(ls)
искажает пробельные и подстановочные символы, в дополнение к искажению непечатаемых символов это ls
может сделать. Список имен файлов в каталоге встроен в оболочку:
for dir in *; do
Если Вы делаете это for dir in */; do
, только подкаталоги текущего каталога подобраны, не другие виды файлов.
if [ -f $dir/sysconfig.out];
Вам нужен пробел на каждой стороне скобок, кроме тех случаев, когда символ рядом с ним является знаком пунктуации оболочки: ();&|<>
. И снова, помещенные двойные кавычки вокруг подстановок переменных (это идет для любого места, где у Вас есть подстановка переменных): if [ -f "$dir/sysconfig.out" ];
#cd back to where we started cd $OLDPWD
Это бесполезно: процесс собирается выйти, изменение его текущего каталога ни на что не будет влиять. Обратите внимание, что каждый процесс имеет свой собственный текущий каталог: изменение его в сценарии не влияет на программу который названный сценарием.
Превращение к причине, которую Вы задали этому вопросу, не ясно, что Вы хотите “.binary file /some/subdirectory/
” не имеет большого смысла: Вы не получили бы это сообщение с каталогом. Для лучшей справки, вставка копии сообщение об ошибке. Вы должны всегда сообщения об ошибках вставки копии, когда Вы обращаетесь за помощью онлайн.
Из Вашего описания кажется, что файлы переместили один уровень каталога глубже. Если это так, измените строку for dir in */; do
кому:
for dir in */*/; do
Существуют многочисленные способы, которыми Вы могли сделать это. Вы могли или запустить свой существующий скрипт в для цикла, или использование находит и xargs или возможно даже использует grep's -r
иначе --recursive
опция.
Самое простое должно, вероятно, только записать для обертки цикла вокруг Вашего существующего сценария. Например:
#! /bin/bash
cd /path/to/top/level/directory
for d in */ ; do
pushd $d
# call your script here
popd
done
for d in $(find . -type d); do ...
– cas
02.08.2012, 13:24
Небольшое улучшение предложения @rush find
, вместо использования переключателя -exec
, вы можете избежать добавления команды cd
, сделав что-то вроде этого:
find /path/to/dir/containing/subdirs -type d -execdir /path/to/your/script.sh \;
Таким образом, вы можете полностью избежать цикла for
в вашем оригинальном скрипте.