2013-07-22 2 views
0

Я пытаюсь получить часть имени каталога, сохраненного в переменной, чтобы я мог добавить его в начало имени файла.Grep/Awk часть имени каталога переменной iteratively

Это то, что я до сих пор:

var=1 
CH=`ls | awk '/[0-9]{2}(?=_.*)/ {if (NR=$var) print $0}'` 
echo $CH 

Имя папки выглядит 01_Startup. Но эхо пусто. Я не могу понять это. Кто-нибудь знает, возможно ли это с помощью сценария оболочки? Я не совсем уверен в том, как и как сочетать команды. Благодарю.

Дерево:

Benu-master 
| 
|--Chapter_02_Startup 
|--|--01_Source_tree 
|--|--02_Console 
|--|--03_DEBUG 

И так далее.

+0

Вопрос говорит 'имя папки выглядит 01_Startup', но ваша картина показывает имя папки,' Chapter_02_Startup'. какой из них правильный? – anubhava

+0

Также вы хотите поставить prefx '02_' для всех файлов в подпапке главы или только для файла' * _DEBUG'? – anubhava

+0

@anubhava Я объяснил ниже, что сделал ошибку, и хотел сказать, что хочу папку 'Chapter_02_Startup'. Я хочу префикс каждого файла 'iso' в подпапке. У .iso есть имена типа '01_Source_tree.iso' и' 02_Console' и так далее. –

ответ

1

Что-то вроде этого?

for c in Chapter_*; do 
    v=${c#Chapter_} 
    v=${v%%_*} 
    echo chapter $c has number $v # more chapter-processing code here 
done 

В стороне, avoid parsing ls output.

+0

Замена '(pwd)' с моей переменной, которая содержит имя главы, работает! По какой-то причине он работает в каждой папке, кроме папки два. Все остальные папки - 'Chapter _ ## _ xxx', а Глава вторая -' Chapter _ ## _ xxx_xxx'. Похоже, что это не сработает, когда последует другое подчеркивание. Любая идея почему? Я могу просто переименовать эту папку, но мне любопытно, почему она не работает. –

+0

Подстановка '$ {var% pattern}' заменяет кратчайший возможный шаблон, тогда как '$ {var %% pattern}' заменяет самое длинное совпадение. Обновлен ответ, чтобы разрешить несколько подчеркиваний. – tripleee

+0

Отлично! Большое спасибо! –

1

awk не поддерживает PCRE, так что положительный результат не будет работать. Кроме того, переменные bash не могут быть вызваны в awk.

То, что я вижу из вашего требования, может быть встречено с помощью bash, встроенного в замену строк.

$ var=01_Startup 
$ echo "${var%_*}" 
01 

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

find . -type d | while read -r dir; do echo "$dir ---> ${dir%_*}"; done 
+0

Ну, мне нужно иметь возможность запускать команду итеративно. Я рекурсивно компилирую программы, поэтому мне нужен счетчик, поэтому я могу перейти в следующий подкаталог. Способ, которым я его настроил: 'buildall.sh' находится в основном каталоге вместе с 8 другими папками. Каждая из этих 8 папок имеет от 1 до 6 подпапок, содержащих программы для компиляции. Я хочу взять начальный номер из этих подпапок и добавить его в свою программу. –

+0

Итак, в подпапках есть номера, есть ли в папках также номера? Можете ли вы сделать «главную папку дерева» и поместить вывод в свой вопрос? –

+0

Существует более 6000 файлов, поэтому выход здесь слишком большой. Это слишком велико для терминала! Я положил скелет в мой первый пост. Я только пытаюсь получить номер из верхних каталогов (например, Chapter_02_Startup). Я понимаю, прежде чем я сказал, что пытался получить номер из самых низких каталогов, это была ошибка ... –

1

Попробуйте эту команду найти с AWK:

find Chapter* -name "*.iso" -type f | awk -F'/' '{ 
    split($1, a, "_"); 
    system("mv " $0 " " $1 "/" a[2] "_" $2) 
}' 
+0

Спасибо, но тройной избил вас. :) –

+0

Что бы ни работало для вас, в конечном итоге важно решить вашу проблему :) – anubhava

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