Запустить скрипт на каждом уровне каталога - PullRequest
0 голосов
/ 01 мая 2019

У меня есть скрипт с именем sumrize.sh, который выдает сводку по файлу / dirs внутри каталога.Я хотел бы, чтобы он работал рекурсивно по всему дереву сверху.Какой хороший способ сделать это?

Я пытался зациклить его с циклом for с

for dir in */; do
cd $dir
./summarize.sh
cd ..

, однако он возвращает ./summarize.sh: нет файла или каталога Это потому, чтоЯ не перемещаю сценарий, как я его запускаю?Я не очень знаком с каталогами Unix.

Ответы [ 3 ]

1 голос
/ 01 мая 2019

Проблема заключается в том, что вы переходите в другой каталог с помощью команды cd, в то время как ваш скрипт sumrize.sh не находится в этих каталогах.Одним из возможных решений является использование абсолютного пути вместо относительного.Например, измените:

./summarize.sh

на что-то вроде:

/path/to/file/summarize.sh

В качестве альтернативы, в приведенном примере кода вы также можете использовать относительный путь, указывающий на предыдущий каталог, например:

../summarize.sh
1 голос
/ 01 мая 2019

Вы можете рекурсивно вывести список файлов, используя find . -type f, и заставить свой сценарий принять заинтересованный файл в качестве первого аргумента, так что вы можете сделать find . -type f -exec myScript.sh {} \;

Если вы хотите только каталоги, используйте find . -type d вместо этого,или если вы хотите, чтобы оба использовали просто find . без ограничений.

Дополнительная опция по имени, например, find . -name '*.py'

Наконец, если вы не хотите переписывать структуру каталогов, то есть толькоСуммируя верхний уровень, вы можете использовать опцию -maxdepth 1, что-то вроде find . -type d -maxdepth 1 -exec myScript.sh {} \;.

0 голосов
/ 01 мая 2019

Попробуйте этот код, если вы используете Bash 4.0 или новее:

#! /bin/bash -p

shopt -s nullglob   # Globs expand to nothing when they match nothing
shopt -s globstar   # Enable ** to expand over the directory hierarchy

summarizer_path=$PWD/summarize.sh

for dir in **/ ; do
    cd -- "$dir"
    "$summarizer_path"
    cd - >/dev/null
done
  • shopt -s nullglob позволяет избежать ошибки в случае отсутствия каталогов под текущей.
  • Переменная summarizer_path имеет абсолютный путь для программы summarize.sh. Это необходимо для того, чтобы он мог запускаться в каталогах, отличных от текущего. (./summarize.sh работает только в текущем каталоге, ..)
  • Используйте cd -- ..., чтобы избежать проблем, если любое имя каталога начинается с '-'.
  • cd - >/dev/null до cd к предыдущему каталогу и выбросьте его путь при выводе с помощью cd -.
  • Shellcheck выдает несколько предупреждений о приведенном выше коде, все это связано с использованием cd. Я бы исправил их для «настоящего» кода.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...