Você pode usar as expansões do parâmetro de shell construídas ${VAR#PREFIX}
e ${VAR%SUFFIX}
para obter o valor de uma variável com o prefixo ou sufixo especificado removidos. Se PREFIX for um padrão, a string correspondente mais curta será removida; com ##
ou %%
, a correspondência mais longa é removida. Essas construções estão disponíveis em todos os shell sh-type (Bourne / POSIX), não apenas bash.
Se o valor de VAR
for um caminho como /path/to/directory/file
, "${VAR%/*}"
será o diretório que contém o arquivo e "${VAR##*/}"
será o nome do arquivo sem a parte do diretório. Observe que "${VAR%/*}"
só está correto se $VAR
contiver pelo menos um /
e "${VAR##*/}"
somente se VAR
não terminar com /
. Há também utilitários chamados dirname
e basename
, que são mais confiáveis a esse respeito. Da mesma forma ${VAR##*.}
é a última extensão.
for x in /psds/*/*.jpg; do
dir="${x%/*}"
mv "$x" "$dir/${dir##*/}.jpg"
done
Como de costume, o zsh tem um jeito meio críptico, mas curto e doce. A função zmv
é conveniente para renomear arquivos em massa.
autoload -U zmv # put this in your .zshrc
zmv '/psds/(*)/*.jpg' '/psds/$1/$1.jpg'
Outra abordagem que usa modificadores de expansão de histórico na expansão de parâmetros:
zmv '/psds/*/*.jpg' '$f:h/$f:h:t.$f:e'