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'