Renomeia vários diretórios na linha de comando

2

Eu tenho algumas pastas chamadas:

Session 1
Session 2
Session 3
Session 4
Session 5
Session 6
Session 7
Session 8

Gostaria de renomeá-los para:

Folder 1
Folder 2
Folder 3
Folder 4
Folder 5
Folder 6
Folder 7
Folder 8

Como eu faria isso no terminal da maneira mais eficaz?

Eu sei sobre mmv mv e rename , mas não tenho certeza do que devo usar e como fazê-lo.

    
por Rtsne42 11.02.2017 / 15:16

2 respostas

7

nome do produto

A maneira mais simples seria usar rename ou prename , que é um script Perl (se você é um usuário ksh ou mksh , esse shell tem a função rename integrada, que é diferente, por uma questão de consistência, eu vou usar prename quando se referir a esse script Perl; alternativamente, você pode chamar /usr/bin/rename - caminho completo para o executável).

$ ls
Session 1/  Session 2/  Session 3/  Session 4/  Session 5/  Session 6/  Session 7/  Session 8/
$ prename 's/Session/Folder/' Session*/                                                                                  
$ ls
Folder 1/  Folder 2/  Folder 3/  Folder 4/  Folder 5/  Folder 6/  Folder 7/  Folder 8/

Se você precisar de uma pesquisa recursiva ou garantir que encontrou o tipo certo de item (talvez você também tenha arquivos com a palavra "Session" no nome do arquivo), é possível combinar isso com find utility:

$ ls
Folder 1/  Folder 2/  Folder 3/  Folder 4/  Folder 5/  Folder 6/  Folder 7/  Folder 8/

$ find -maxdepth 1 -type d -name "Session *" -exec prename 's/Session/Folder/' {} \;                                      

$ ls
Folder 1/  Folder 2/  Folder 3/  Folder 4/  Folder 5/  Folder 6/  Folder 7/  Folder 8/

Um pouco longo, talvez um pouco redundante, mas funciona.

mv

O pequeno problema com mv é que precisamos alterar o nome do destino a cada vez, então, por si só, ele não pode fazer o que queremos. Para fazer isso, teríamos que combiná-lo com algumas outras ferramentas, como as ferramentas find ou bash .

$ ls
Session 1/  Session 2/  Session 3/  Session 4/  Session 5/  Session 6/  Session 7/  Session 8/


$ for dir in Session*/ ; do mv "${dir}" "Folder ${dir##*\ }" ;done                                                       

$ ls
Folder 1/  Folder 2/  Folder 3/  Folder 4/  Folder 5/  Folder 6/  Folder 7/  Folder 8/

O que você vê aqui é que estamos circulando todos os itens que contêm a palavra Session neles e são o diretório. Usamos a expansão de parâmetro '$ {dir ## * \} "para extrair tudo após o espaço no nome do diretório (que é o respectivo número) e formar uma nova string" Folder / ".

Nos comandos prename e mv , usamos globbing, o que significa que essas abordagens renomearão todos os diretórios que contenham a palavra "Session", mesmo "Session blah". Não é o ideal, é claro, mas para o caso específico em que você sabe que a nomeação da pasta é consistente, isso funcionará. Alternativamente, poderíamos aumentar o comando com for dir in Session\ [1-9] ; do . . .done .

Em outras palavras, essa abordagem pode funcionar, mas é muito simplista e não é a melhor.

Python

Claro, outras ferramentas também podem ser usadas. Por exemplo, Python:

$ ls
Session 1/  Session 3/  Session 5/  Session 7/
Session 2/  Session 4/  Session 6/  Session 8/

$ python -c 'import os,shutil;map(lambda x:shutil.move(x,x.replace("Session","Folder")),os.listdir("."))'                

$ ls
Folder 1/  Folder 2/  Folder 3/  Folder 4/  Folder 5/  Folder 6/  Folder 7/  Folder 8/
    
por Sergiy Kolodyazhnyy 11.02.2017 / 15:40
0

Vá para a pasta que contém toda a pasta que você deseja renomear e fazer:

find . * | rename 's\Session\Folder\'
    
por Emilio Galarraga 11.02.2017 / 16:04