Shell Scripting: como usar parte do caminho do arquivo como o nome do arquivo?

2

Eu tenho um grupo de diretórios, cada um contendo exatamente 1 imagem jpeg, assim -

/psds/folder1/image.jpg
/psds/someotherfolder/picture.jpg
/psds/yetanotherfolder/thumbnail.jpg

Qual é a maneira apropriada de renomear os jpegs para o nome da pasta que os contém? O que eu quero é:

/psds/folder1/folder1.jpg
/psds/someotherfolder/someotherfolder.jpg
/psds/yetanotherfolder/yetanotherfolder.jpg
    
por Micah 27.03.2014 / 15:49

2 respostas

1

Execute os comandos abaixo dentro do diretório /psds .

for f in ./*; do
    if [ -d "$f" ] ; then
        cd "$f"
        mv *.jpg "$f.jpg"
        cd ..
    fi
done

Se você tiver 3 pastas dentro do diretório /psds , como abaixo,

/psds/folder1/image1.jpg
/psds/folder2/image2.jpg
/psds/folder3/image3.jpg

Depois de executar o comando acima, os arquivos serão renomeados como

/psds/folder1/folder1.jpg
/psds/folder2/folder2.jpg
/psds/folder3/folder3.jpg
    
por 27.03.2014 / 15:56
0

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'
    
por 28.03.2014 / 03:23