Сценарий оболочки для выполнения сценария оболочки ко всем подкаталогам

Не непосредственно. Можно поставить капканы в коде так, чтобы можно было получить часть того, что ЦП делает в тот момент в коде, но Вы не можете на самом деле "видеть" то, в чем это выполняет в реальном времени.

3
02.08.2012, 14:01
4 ответа

находка сохранит Вас:

find /your/dir/with/subdirs -type d -exec sh -c 'cd "{}" ; /path/to/your/script.sh ;' \;
4
27.01.2020, 21:11
  • 1
    Спасибо порыв... Также попробует это. Я ищу самую легкую реализацию.. :) –  JudeJitsu 02.08.2012, 13:15

В Вашем сценарии существует несколько проблем.

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
3
27.01.2020, 21:11

Существуют многочисленные способы, которыми Вы могли сделать это. Вы могли или запустить свой существующий скрипт в для цикла, или использование находит и 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
1
27.01.2020, 21:11
  • 1
    Спасибо Craig. Попробует это... Цените справку :) Это может быть сделано к CD всего один подкаталог глубоко? Поскольку подкаталоги имеют свой собственный подкаталог "истории", который содержит то же имя файла. –  JudeJitsu 02.08.2012, 13:12
  • 2
    , как записано, это только выполняет итерации через подкаталоги первого уровня Вашего каталога верхнего уровня. т.е. да. если бы Вам был нужен он для обработки каждого подкаталога, ниже которого необходимо было бы сделать что-то как 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 в вашем оригинальном скрипте.

0
27.01.2020, 21:11

Теги

Похожие вопросы