Renomeia arquivos baseados em nomes de diretórios

2

Como posso renomear arquivos .jpg em várias pastas com base no nome da pasta? Eu também quero que os arquivos .jpg permaneçam em suas respectivas pastas e não sejam movidos. Os nomes das pastas não têm espaços.

Portanto, por exemplo, se o nome da pasta for Vermelho, quero que os nomes dos arquivos resultantes sejam:

Red000001.jpg
Red000002.jpg
Red000003.jpg

Eu tenho o seguinte comando, mas ele fornece resultados indesejáveis, movendo arquivos renomeados para fora de suas respectivas pastas e tornando os nomes de arquivos "desleixados":

start=$PWD;
for directory in *; do
  cd "$directory";
  for filename in *; do
    mv "$filename" ../"Folder $directory - $filename";
  done;
  cd "$start";
done
    
por user8547 26.01.2015 / 06:46

1 resposta

1

Se você tiver que cd entrar e sair de vários diretórios, faz sentido usar cd - , o que leva você ao último diretório de trabalho atual. Ou você usa pushd / popd (em bash ).

for directory in *; do
  pushd "$directory"
  index=1
  for filename in *; do
    extension="${filename##*.}"
    if [ "$filename" != "$extension" ]; then
      extension=".$extension"
    else
      # i.e. there is no dot in the file name
      extension=""
    fi
    target_filename="${directory}$(printf "%06d" "$index")${extension}"
    if [ -f "$target_filename" ]; then
      echo "File ${target_filename} exists; aborting."
      exit 3
    fi
    mv "$filename" "${target_filename}"
    ((index++))
  done
  popd
done

Este código não suporta colisões de nomes (se já houver um arquivo Red00004 ). Apenas verifica e aborta.

    
por 26.01.2015 / 07:01