Ao se referir a $c
if por nome_do_arquivo você significa caminho completo para o arquivo, então este trabalho é realmente muito fácil. Existem algumas maneiras de fazer isso.
Usando apenas globs de shell POSIX e expansão de parâmetros, você pode fazer:
c='/home/user/working-root-directory/band-folder/album-name/music-file.mp3'
file=${c##*/}
album=${c#*"${c%/*/"$file"}"/}
band=${c#*"${c%/*/"$album"}"/}
band=${band%%/*} album=${album%%/*}
Basicamente, ele funciona cortando uma string da cauda da variável e, em seguida, cortando os resultados da cabeça da variável. Na última linha, quaisquer restos indesejados da cauda são removidos. Talvez seja mais fácil de entender com dados do mundo real. Se você colocasse o snippet acima em um shell com set -x
habilitado, você veria algo nessas linhas impresso em stderr
:
+ c=/home/user/working-root-directory/band-folder/album-name/music-file.mp3
+ file=music-file.mp3
+ album=album-name/music-file.mp3
+ band=band-folder/album-name/music-file.mp3
+ band=band-folder
+ album=album-name
Outra maneira de fazer isso é usar o separador de campo interno do shell para dividir o nome do caminho nos limites /
.
set -f; IFS=/ #disable globbing so as not to gen more filenames
set -- $c #set the shell's arg array to split path
shift "$(($#-3))" #remove all but relevant fields
band=$1 album=$2 file=$3 #assign values
Aqui estão mais alguns set -x
output:
+ c=/home/user/working-root-directory/band-folder/album-name/music-file.mp3
+ set -f
+ IFS=/
+ set -- '' home user working-root-directory band-folder album-name music-file.mp3
+ shift 4
+ band=band-folder
+ album=album-name
+ file=music-file.mp3