Выполнить набор команд в каждом подкаталоге

Выполнить набор команд в каждом подкаталоге

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

OUTPUTFN=`basename $PWD`
cat *.xml > $OUTPUTFN.txt
mv $OUTPUTFN.txt $OUTPUTFN.xml
mv $OUTPUTFN.xml ..

В этом каталоге более 700 папок, я хочу, чтобы он зашел в каждую, выполнил эти четыре команды, а затем перешел к следующей, выполнил команды и повторил. Я пробовал объединить несколько примеров с этого сайта со своими командами, но не смог заставить это работать.

решение1

Сценарий

for DIR in *; do
    [ -d "$DIR" ] && cat "$DIR"/*.xml > "$DIR.xml"
done

Один лайнер

for DIR in *; do [ -d "$DIR" ] && cat "$DIR"/*.xml > "$DIR.xml"; done

Как это работает

  • Bash расширяется *на все файлы и каталоги в текущем каталоге.

  • for DIR in *; do ... doneпроходит по ним и выполняет ...для каждого из них.

    В каждом случае $DIRсодержит имя текущей записи.

  • [ -d "$DIR" ] && ...проверяет, $DIRдействительно ли это каталог (а не файл).

    Если да, ...то его казнят.

  • cat "$DIR"/*.xml > "$DIR.xml"делает ровно то же, что и ваши четыре строки кода.

Связанный контент