
У меня есть следующие команды, которые я хотел бы запустить внутри каждого подкаталога текущего рабочего каталога. Вот команды:
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"
делает ровно то же, что и ваши четыре строки кода.