2014-12-14 8 views
-1

Я серия mp3s изложенной в папках, как такс помощью Баша, чтобы извлечь имя папки

/mnt/media/Music1/DJ_Mixes_01-71/DJ aaa/01.mp3 
/mnt/media/Music1/DJ_Mixes_01-71/DJ 02/01.mp3 
/mnt/media/Music1/DJ_Mixes_01-71/DJ Chemist/01.mp3 

есть способ я могу использовать СЭД, чтобы захватить имена папок

DJ aaa 
DJ 02 
DJ Chemist 
+1

[См] (http://stackoverflow.com/questions/23162299/how- to-get-the-last-part-of-of-dirname-in-bash) – Basilevs

+0

awesome thanks Basilevs, именно то, что я искал – chemist

ответ

0

комбинат basename с dirname:

f="/mnt/media/Music1/DJ_Mixes_01-71/DJ aaa/01.mp3" 
d=$(dirname "$f") 
echo "$(basename "$d")" 

дает DJ aaa

+0

Спасибо. Исправленный! –

+0

И вам все же нужно процитировать подстановку команд в выражении 'echo':' echo '$ (basename "$ d") "', иначе ваш код будет подвержен расширению пути. –

1

Вы можете также использовать расширение параметра с подстроки экстракции в качестве альтернативы `Dirname/'базовому; Вот краткий пример читает все ваши имена каталогов из файла данных:

#!/bin/bash 

printf "\n The following directories were isolated:\n\n" 

while read -r line || test -n "$line" ; do 

    pname="${line%/*}"  # remove filename from line 
    lastd="${pname##*/}" # remove up to last '/' 

    printf " %-12s from %s\n" "$lastd" "$line" 

done <"$1" 

printf "\n" 

exit 0 

вход:

$ cat dat/mp3dirs.txt 
/mnt/media/Music1/DJ_Mixes_01-71/DJ aaa/01.mp3 
/mnt/media/Music1/DJ_Mixes_01-71/DJ 02/01.mp3 
/mnt/media/Music1/DJ_Mixes_01-71/DJ Chemist/01.mp3 

выход:

$ ./lastdir.sh dat/mp3dirs.txt 

The following directories were isolated: 

DJ aaa  from /mnt/media/Music1/DJ_Mixes_01-71/DJ aaa/01.mp3 
DJ 02   from /mnt/media/Music1/DJ_Mixes_01-71/DJ 02/01.mp3 
DJ Chemist from /mnt/media/Music1/DJ_Mixes_01-71/DJ Chemist/01.mp3 
+0

Если вы идете по пути bash, другой вариант - использовать 'read' для выполнения разделения для вас:' IFS =/read -r -a line_ary; делать ...'и вы получите часть каталога, который вы хотите, в' line_ary [-2] '. –

+0

Да, я много играл. Мне нравится индекс '-2'. Это то, что я не рассматривал. Я использовал 'IFS' при использовании цикла' for' для обработки, но для совершенно противоположной причины. Спасибо за комментарий. –

0

Через СЭД:

sed -r 's/.*\/(.*)\/.*$/\1/' file 

Через AWK:

awk -F/ '{print $(NF-1)}' file 

Через Grep:

grep -Po '.*\/\K.*(?=\/.*$)' file 

Через разрез:

cut -d'/' -f6 file   # for fixed number of fields 

или

rev file |cut -d'/' -f2 |rev # for any length of fields 

Через cuts:

cuts -2 file 
+0

В вашем решении 'cut' вы принимаете фиксированное количество полей. Это не хорошо. –

+0

@gniourf_gniourf да, но я не хотел использовать команду 'rev'. но обновлено :) –

0

Вы можете попробовать его, как показано ниже. \( и \) отметит образец от DJ до последнего символа перед Результаты /

sed 's#.*\(DJ [[:alnum:]]\{1,\}\)/.*#\1#g' 

DJ aaa 
DJ 02 
DJ Chemist 
Смежные вопросы