2013-06-10 5 views
2

Я хочу запустить программу для файла, который существует в разных подкаталогах, а затем перенаправить вывод в выходной файл. Я хочу, чтобы результат был сохранен в каталоге, в котором была запущена программа.выполнить команду в подкаталогах

Так что я хотел бы сделать что-то вроде этого:

for x in */*.txt; do command $x > output.fsa; done 

Мои вопросы:

  1. Является ли это исправить выше цикл? следует ли мне менять каталог, чтобы сохранить вывод в каталоге, в котором была выполнена команда, или linux позаботится об этом?
  2. любые идеи о том, как указать имя каталога в выходном файле?

ответ

1

Петля правильная, вы будете перебирать все файлы txt в поддирерах текущего pwd (где выполняется этот скрипт или команда). Вам не нужно менять каталог, чтобы сохранить вывод в этом субдире. Linux не заботиться о нем :)

Вы можете удалить все после первой / с помощью расширения переменных ${x%%/*}

Попробуйте

for x in */*.txt; do 
    command "$x" > "${x%%/*}"/output.fsa 
done 

Помните, что если у вас есть более текстовые файлы в этом подкаталоге, вам будет выполнять команду «$ x» еще раз и переписать output.fsa.

Вы можете использовать Append (>>) в этом случае

Попробуйте

for x in */*.txt; do 
    echo "Executing command \"$x\"" >> "${x%%/*}"/output.fsa 
    command "$x" >> "${x%%/*}"/output.fsa 
done 
2

ли это исправить выше цикл?

Да

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

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

for x in */*.txt; do command $x > `dirname $x`/output.fsa; done 
+0

Я думаю, что вы имели в виду 'dirname', а не' basename'. – Hasturkun

+0

@Hasturkun Конечно, спасибо. –

+0

nice Я вижу, что имя dirname даст мне разные имена для выходного файла. – mpg

Смежные вопросы