
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 a
significará que os caminhos para a/b
e a/b/c
não são mais válidos. A find
opçã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 -print0
em conjunto com a -d ''
opção para read
lidar 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
, file
e name
match 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 bash
pá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/c
removerí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/c
removerí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[gh
terminaríamos comabcdefgh