renomear diretórios contendo quadrados esquerdo/direito

renomear diretórios contendo quadrados esquerdo/direito

Para renomear diretórios contendo quadrados esquerdo e direito, você pode usar:

shopt -s globstar 
rename -n 's/\(|\[|\]|\)//g' **

Isso renomeará tudo com [&] do diretório em que você está e recursivamente.

mas preciso executar isso como um script nemo.action e não consigo fazê-lo funcionar. (Basicamente um script bash normal)

Meu script atual é:

#!/bin/bash
shopt -s globstar 

rename  "$@" 's/\(|\[|\]|\)//g' **

Onde $@é/media/sf_Mediaserver3/Untitled Folder/[ hdjue] [kskk]

onde o[ hdjue] [kskk] (apenas letras aleatórias)é a pasta inicial que desejo renomear e os seguintes arquivos/pastas...

É claro que isso não funciona, e agora tenho que ir para o diretório pai e executar as primeiras linhas, mas isso processaria TODOS os diretórios no diretório pai, não apenas [ hdjue] [kskk] alguém tem alguma ideia de como resolver isso?

quase parece que a função renomear não consegue lidar com um diretório inicial?

E se possível, remova todos os espaços (substitua por . (ponto)) e coloque o nome do arquivo/diretório em letras minúsculas, para simplificar a compatibilidade com solicitações externas/internas.

Responder1

O requisito aqui, pelo que entendi, é remover todas as instâncias dos caracteres [e ]dos arquivos e diretórios nos caminhos especificados.

A dificuldade é evitar renomear o diretório enquanto ele ainda está sendo percorrido. O globstar **lista os itens da raiz para baixo, em vez da profundidade primeiro, portanto, dado um exemplo como a a/b a/b/c, renomear asignificará que os caminhos para a/be a/b/cnão são mais válidos. A findopção pode lidar com isso com seu -depth, mas isso requer uma abordagem diferente

#!/bin/bash
#
find "$@" -depth -name '*[[\]]*' -print0 |
    while IFS= read -d '' -r item
    do
        path="${item%/*}" file="${item##*/}"    # Separate path and file name parts
        name="${file//[[\]]/}"                  # Generate new file name
        name="${name// /.}"                     # Comment: space becomes dot
        name="${name,,}"                        # Comment: lowercase name

        echo mv -f "$item" "$path/$name"        # Rename
    done

Remova echo(ou complemente) quando estiver satisfeito com o script que fará o que você espera.

Usei -print0em conjunto com a -d ''opção para readlidar com arquivos com nomes realmente estranhos (incluindo aqueles com novas linhas e caracteres não imprimíveis). Você pode remover ambos se quiser ver o que está acontecendo - ou se suas implementações não os suportarem - mas o script se tornará menos robusto

Os modificadores ao atribuir as variáveis path​​, filee namematch usando globs (não expressões regulares). Um único modificador ( %, #, /) significa uma correspondência mais curta ou única; um modificador duplo ( %%, ##, //) significa uma correspondência mais longa ou múltiplas correspondências. Está tudo documentado na bashpágina de manual, mas aqui está minha explicação com contexto:

  • ${item%/*}O %indica que omais curtocorrespondência com o padrão glob deve ser removida dofimdo valor de $item. Então, a/b/cremoveríamos a correspondência de texto, /*deixandoa/b
  • ${item##*/}O ##indica que omais longocorrespondência com o padrão glob deve ser removida docomeçodo valor de $item. Então, a/b/cremoveríamos a correspondência de texto, */deixandoc
  • ${file//[[\]]/}O //indica quemúltiploas substituições do glob devem ser substituídas pelo texto seguinte ao next /, ou seja, nada. O glob é uma coleção entre colchetes dos dois caracteres [e ], que significa "ou [ou ]". Então, ab[cd]ef[ghterminaríamos comabcdefgh

informação relacionada