Remoção de dois pontos no nome do diretório

7

Atualmente, o diretório que é criado automaticamente para um programa com o qual estou trabalhando inclui dois pontos ( : ), criando problemas quando tento manipular o diretório. Alguém poderia me ajudar primeiro a remover este dois pontos e, em seguida, ser capaz de cd no diretório renomeado? (Então eu acho que eu teria que igualar o novo nome do diretório para uma variável?)

Exemplo:

  • nome do diretório atual: Lang-32b-Branch:Line
  • nome do diretório desejado: Lang-32b-BranchLine
por Biscuit 28.02.2018 / 15:56

3 respostas

11

Para conseguir isso manualmente, de forma simples, você pode usar o comando mv com algumas citações strongs para garantir que o shell não interprete os dois-pontos como um caractere especial:

mv 'Lang-32b-Branch:Line' 'Lang-32b-BranchLine' && cd 'Lang-32b-BranchLine'

Uma abordagem alternativa é usar uma variável e um dos recursos da expansão do parâmetro Bash, o que pode ser mais útil se você quiser automatizar a alteração desse nome de diretório em um script:

dir=Lang-32b-Branch:Line
mv "$dir" "${dir//:/}"

A expansão de "${dir//:/}" substituirá qualquer ocorrência do caractere de dois-pontos por nada, fornecendo o resultado esperado de Lang-32b-BranchLine. Usar "${dir/:/}" resultaria apenas na primeira ocorrência do cólon sendo removido, embora isso ainda funcione para o exemplo dado.

Como one-liner para mover e cd no diretório:

dir=Lang-32b-Branch:Line ; mv "$dir" "${dir//:/}" && cd "${dir//:/}"

Ou se você deseja capturar o nome do diretório modificado em uma variável chamada new_dir:

dir=Lang-32b-Branch:Line ; new_dir="${dir//:/}"; mv "$dir" "$new_dir" && cd "$new_dir"

Um ótimo guia para a expansão de parâmetros do Bash está disponível aqui .

    
por Arronical 28.02.2018 / 16:04
8

Se você quiser que um comando geral renomeie vários arquivos e / ou diretórios com um ou mais dois pontos, você pode usar rename ,

rename 's/://g' *

Depois disso, você pode cd em qualquer um dos diretórios (que você modificou) como de costume (sem aspas).

Linha de comando alternativa de acordo com as dicas nos comentários de @DavidFoerster e @dessert,

rename 's/://g' *\:*/
  • Se você quiser limitar as ações de renomeação aos diretórios, adicione uma barra depois da estrela do wild-card.
  • Você também pode colocar dois pontos na expressão wild-card para limitar a seleção de arquivos àqueles, que contêm dois pontos no nome do arquivo, o que pode tornar a ação mais rápida, se uma quantidade enorme de diretórios for pesquisada

Editar:

@EliahKagan sugere começar com um 'dry run' com a opção -n,

rename -n 's/://g' *
  

que apenas mostra quais operações de renomeação seriam executadas.   Em seguida, ele pode ser executado novamente com a opção -n removida para realmente renomear   os arquivos. Isso ajuda a evitar erros, como renomear acidentalmente   um monte de arquivos que alguém queria deixar sozinho.

    
por sudodus 28.02.2018 / 16:06
4

Se for apenas um diretório, você pode usar mv e cd . Para aproveitar o poder da bash Expansão do Histórico e parâmetro especial $_ :

mv Lang-32b-Branch:Line !#:$:s/:/ && cd $_

!#:$:s/:/ é substituído pela última palavra ( $ ) da linha de comando atual ( !# ), onde o primeiro : é s substituído por nada. Se você quiser que todos os dois pontos sejam removidos, altere-o para !#:$:gs/:/ ( g lobally). $_ é simplesmente substituído pelo último argumento do último comando.

    
por dessert 28.02.2018 / 16:08