2013-05-21 4 views
3

Я начинаю программировать Шелл. В настоящее время я пишу скрипт для работы с найденными файлами. но мне нужно было бы получить имена родительских каталогов для найденных файлов. Например,Shell: Как указать имя родительского каталога файла?

SEARCH_PATH=/home/test 
for file in `find $SEARCH_PATH -name "pattern"`; 
do 
     echo $file; 
done 

в пути поиска есть несколько папок имеют файл шаблона,

/home/test/type1/log/pattern 
/home/test/type2/log/pattern 
/home/test/type3/log/pattern 

Что мне нужно сделать, это найти «образец» в этих файлах, а также получил прародитель имя справочника к имени 'типа' ...

+1

Возможно, вас заинтересует 'readlink -f filename', это дает вам абсолютный путь к имени файла. – Bort

ответ

2

грязный и быстро:

kent$ dirname $(dirname "/home/test/type1/log/pattern") 
/home/test/type1 

если Ther е не в вашем имени файла не /, вы также можете сделать с SED, AWK разрезом .... один пример: патч в

kent$ echo "/home/test/type1/log/pattern"|sed 's#/[^/]*/[^/]*$##'                           
/home/test/type1 

EDIT только

Тип:

& имя_директории базовое имя:

kent$ basename $(dirname $(dirname "/home/test/type1/log/pattern"))                           
type1 

с AWK:

kent$ echo "/home/test/type1/log/pattern"|awk -F'/' '$0=$(NF-2)'  
type1 
+0

Как я могу получить только «type1», а не «/ home/test /» в начале? – AplusG

+0

@AplusG см. EDIT – Kent

+0

Спасибо, это именно то, чего я ожидал. Может быть грязно, но работать. :) – AplusG

1

Это просто один, заменить:

echo $file; 

в вашем коде

echo "Found `basename $file` in `dirname $file`"; 

И увидеть это как результат ...

Found kbd in /etc 
Found config in /etc/kbd 
... 
+0

Спасибо, это действительно полезно. – AplusG

1

Одно общее решение:

SEARCH_PATH=/home/test 
find "$SEARCH_PATH" -name 'pattern' | rev | cut -d'/' -f3- | rev 

# Step by step explanations: 
# 1. `find` Search all the files for the given pattern (e.g.: "https://stackoverflow.com/a/b/c/d") 
# 2. `rev` Reverse each line (e.g.: "d/c/b/a/") 
# 3. `cut` Remove the filename and the direct parent (e.g.: "b/a/") 
# 4. `rev` Reverse each line again (e.g.: "https://stackoverflow.com/a/b") 

Замечание Я использовал двойную кавычку вокруг $SEARCH_PATH, чтобы избежать плохих расширений в некоторых случаях.