script ou programa Linux para encurtar nomes de arquivos

7

Eu não tive muito sucesso em encontrar uma versão Linux do namemangler , que eu preciso renomear 1000 de arquivos para que eles sejam legível no Windows.

Alguém sabe de um programa Linux que pode fazer isso?

Se não, então um script pode funcionar, pois só preciso renomear todos os arquivos em uma pasta para, digamos, os primeiros 16 caracteres. Eu suspeito que a rota do script pode valer a pena, mas não sei por onde começar.

    
por Grimlockz 29.02.2012 / 13:47

7 respostas

8

No Debian, Ubuntu e derivativos, se você digitar man rename em um prompt de comando, você obterá a página de manual para um utilitário de renomeação que permite a utilização de comandos arbitrários de expressões regulares Perl na renomeação.

Por exemplo, isso reduzirá (truncando) todos os arquivos no diretório atual para um comprimento de cinco:

rename 's/^(.{5}).*/$1/' *

Funciona capturando os primeiros cinco caracteres e usando isso na substituição, removendo o restante.

Outro exemplo é encurtar nomes de arquivos (extensão sans) para cinco caracteres, preservando <<> a extensão:

rename 's/^(.{5}).*(\..*)$/$1$2/' *

Captura dois grupos, sendo o primeiro os primeiros cinco caracteres, o segundo sendo a extensão. Isso transformaria myCarefullyCraftedDocument.pdf em myCar.pdf .

Aviso: Use este cuidadosamente, preferencialmente em uma cópia do seu diretório, ou fazendo backups primeiro. Você foi avisado!! No mínimo, use rename -n primeiro, que mostrará o que seria feito sem realmente fazer isso.

    
por 29.02.2012 / 13:50
3

Você pode mover arquivos em conflito para outro diretório:

for i in *
do
    j=${i:0:16}

    if [ -e "$j" ]
    then
        mv "$i" /path/to/rename/later
    else
        mv "$i" "$j"
    fi
done
    
por 29.02.2012 / 14:23
1

Você pode escrever um script para encurtar nomes de arquivos e remover caracteres que o Windows não gosta em algumas linhas do bash. Aviso, código não testado, digitado diretamente no meu navegador.

shopt -s dotglob extglob
for x in *; do
  y=${x//+([!-!#$%&'().0-9@A-Z^_'a-z{}~])/_}  # change all problematic characters to _
  if [[ $y = .* ]]; then y=_${y#.}; fi        # change dot files to begin with _
  y=${y:0:16}                                 # truncate names
  y=${y,,}                                    # convert to lowercase
  if [[ -e $y || $y =~ ^(aux|clock\$|com[0-9]|con|lpt[0-9]|nul|prn)(\.*)?$ ]]; then
    # The file exists or is a DOS/Windows reserved name.
    # Change foo.bar to foo~1.bar, foo~2.bar, ... (I ignore the length restriction here)
    i=1
    if [[ $y =~ \. ]]; then
      prefix=${y%%.*}; suffix=.${y#*.}
    else
      prefix=$y; suffix=
    fi
    y=${prefix}~$i$suffix
    while [[ -e $y ]]; do
      ((++i))
      y=${prefix}~$i$suffix
    done
  fi
  mv -- "$x" "$y"
done

Se precisar recorrer a subdiretórios, chame um script de shell a partir de find -depth -exec … . Ou use zsh em vez de bash; em zsh, **/*(od) expande para todos os arquivos no diretório atual, recursivamente, com arquivos mais profundamente aninhados primeiro.

    
por 01.03.2012 / 02:24
1

O script shell / python / perl para esse tipo de coisa é bom, mas parece que um aplicativo gui seria melhor para você, então eu recomendaria pyRenamer , que pode fazer exatamente o que você quer, entre muitas outras coisas (operações comuns simples através de presets [se livrando de espaços, truncar nome de arquivo de um ponto para outro], busca / substituição simples, regex complicado, previewer, etc).

Sua distribuição pode até tê-lo em seu repositório de software (o Fedora faz).

    
por 29.02.2012 / 19:56
0

Alguns sistemas não possuem o comando rename , portanto, como uma alternativa à resposta do paxdiablo, aqui está como fazer a mesma coisa com mv .

for f in *.pdf; do 
    tmp='echo $f | sed -r 's//^(.{5}).*(\..*)$/$1$2/''
    mv -b ./"$f" ./"$tmp"
done

O sinalizador -b em movimento cria um backup dos arquivos que seriam excluídos ou sobrescritos. Ao alterar o padrão glob no loop for, você pode ajustar em quais arquivos ele é executado, usando * para executar em todos os arquivos.

    
por 29.02.2012 / 14:25
0

Se você precisar experimentar renomear arquivos e tiver bibliotecas do KDE instaladas em seu sistema (ou não se importar em adicioná-las), confira krename.

Ele permite que você faça algumas tarefas simples de renomeação diretamente com suas ferramentas e também permite expressões regulares para situações mais complicadas.

Ele mostra uma prévia dos arquivos renomeados à medida que você cria as condições de renomeação. Ele também permite que você renomeie os mesmos arquivos novamente, o que é útil se você quiser fazer algo complicado, pois fazer isso em etapas reduziria a complexidade de cada estágio para algo que você possa descobrir rapidamente.

    
por 04.03.2012 / 15:49
-1
for file in *; do
    mv "$file" $(echo "$file" | sed -e 's/[^A-Za-z0-9._-]/_/g')
done &
    
por 05.07.2017 / 00:25