2015-02-04 2 views
1

Я новичок на этом сайте (и для программирования, более или менее), но я надеюсь, что вы сможете помочь.Командная строка bash для ввода нескольких каталогов и выполнения команды

У меня есть многочисленные каталоги с именем 3K, 4K, 5K и т. Д. В каждом каталоге у меня есть 12 подкаталогов с именем v1 по v12, каждый из которых содержит файл с именем OUTCAR. Я пытаюсь написать команду bash, которая позволит мне вводить каждый из подкаталогов и собирать данные из OUTCAR.

Функция работает без проблем при вводе каждого подкаталога в отдельности.

Я использую

для файла в V {1..12}; do grep "key_string" OUTCAR | awk '{print (actual_stuff)}'> output.dat; сделано

Из * K fine, который содержит поддиректории v {1..12}.

Однако, я получаю сообщение об ошибке, указывающее, что OUTCAR не существует для каждого v {1..12}. Я знаю, что это так, поэтому я предполагаю, что сначала я не направил команду на cd в каждый подкаталог. Какие-нибудь советы?

Спасибо!

+0

Если все выходные данные идет в один output.dat файла или вы хотите output.dat файла рядом каждый файл OUTCAR? В целом, вероятно, проще использовать команду find, например: «find -name OUTCAR» и либо выполнить grepping/awking через xargs, либо выполнить итерацию результата с помощью цикла «while read». –

+0

Я собираюсь создать отдельный файл output.dat для каждого OUTCAR, напечатанный в каждом подкаталоге v1-v12. – LRB83

ответ

0

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

find . -type d -name 'v[1-9][[1-9]' \ 
    -exec awk '/key_string/ {print FILENAME ":" $0}' {}/* >> output.dat \; 
+0

Большое спасибо за ваш ответ! Не могли бы вы уточнить -type и -name для меня? – LRB83

+0

Вы можете получить подробную информацию из 'man find'. '-type d' только находит каталоги, а' -name' соответствует шаблону, который снова вызывает имена каталогов. – anubhava

+1

Отлично, еще раз спасибо за помощь! – LRB83

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