Como descartar parte final de vários nomes de diretório?

1

Eu tenho vários diretórios com títulos como "20150512_101129_3016" e outros com sequência adicional após um sublinhado adicional, como "20150512_101129_3016_v1A" (nem sempre é v1A, poderia ser v1 ou V1a, etc). Gostaria de renomear todos os diretórios de forma que a seqüência final após o sublinhado final seja removida. Eu preferiria uma solução que pareça remover todo o texto seguinte (e incluindo) o sublinhado final / terceiro, pois não tenho certeza de que todos os nomes de diretório terão o mesmo número de caracteres no texto anterior ao terceiro sublinhado.

    
por focusbob 15.08.2016 / 20:31

2 respostas

1

Você pode fazer isso com um simples loop de shell:

for x in ./*_*_*_*; do mv -i "$x" "${x%_*}"; done

i.e. para cada arquivo cujo nome contenha pelo menos três sublinhados, renomeie o arquivo, retirando a peça começando no último sublinhado.

Se houver uma colisão (por exemplo, 20150512_101129_3016_v1A e 20150512_101129_3016_v1B ), o primeiro arquivo em ordem lexicográfica será renomeado para o destino desejado e o segundo será movido para um subdiretório, ou seja, 20150512_101129_3016_v1B será movido para 20150512_101129_3016/20150512_101129_3016_v1B após 20150512_101129_3016_v1A ter sido renomeado para 20150512_101129_3016 . Para evitar isso, adicione uma verificação extra:

for x in ./*_*_*_*; do
  if [ -e "${x%_*}" ]; then
    echo "Not renaming $x because ${x%_*} already exists"
    continue
  fi
  mv "$x" "${x%_*}"
done

Como alternativa, no Linux, passe a opção -T para mv para fazer essa verificação.

    
por 16.08.2016 / 02:58
-1

se os nomes dos diretórios originais forem homogêneos, ou seja, seguir o formato de XXXXX_XXXX_XXXX (então pode ser seguido por outro _ XXXX) este segmento de código abaixo, deve funcionar:

find ./ -maxdepth 1 -type d | while read dir; do
newdir=$(echo ${dir} | cut -d_ -f1-3)
# duplicate directory name protection
if [ -d ${newdir} ]
then 
  newdir=${newdir}_
  echo "duplicate directory encountered. Appending _ to the new dir name"
fi

#did the dir name change ? If not, do nothing
if [ ${newdir} != ${dir} ]
then
  mv ${dir} ${newdir}
fi
done

assume que você está no diretório que contém esses subdiretórios.

    
por 15.08.2016 / 20:41