Existe uma maneira de usar * no destino de cp, mv, etc?

2

No prompt de comando do Windows, você pode fazer esse tipo de coisa:

  • ren *.doc *.txt
  • copy my-precious-document.doc *-backup.doc

Existe uma maneira de fazer isso é o mundo do Linux (incluindo o OS X)? É uma coisa muito estranha descobrir comandos de linha de comando que funcionaram melhor no DOS ...

    
por Steve Bennett 22.11.2011 / 03:15

3 respostas

2

Não realmente. No Windows, globbing (no Windows, somente curingas) é executado pelo comando; em * nix, globbing é feito pelo shell. Seu primeiro exemplo seria algo assim:

mv a.doc b.doc c.doc a.txt b.txt c.txt

Obviamente, o utilitário não tem idéia do que fazer com isso, e não deveria (ignorando coisas como mv , supondo que você esteja tentando mover para um diretório). Para realizar algo parecido com o que você deseja fazer, é necessário usar algo assim:

find . -name "*.doc" -print0 | xargs -0 -I {} mv {} {}.txt
# Or...
find . -name "*.doc" -exec mv {} {}.txt \;

Convenientemente, há também um utilitário incluído no Perl que pode ser usado para renomear arquivos, apropriadamente chamado rename .

rename 's/\.txt$//' *.doc
    
por 22.11.2011 / 03:25
2

Observe que há duas versões de rename que acompanham várias distros.

O Perl rename é padrão no Ubuntu e as variantes são respondidas por @ Hello71

Outras distribuições podem enviar o pacote util-linux-ng onde a sintaxe é:

rename <from> <to> <files>

Para realizar o funcionamento no OP, o comando seria

rename .doc .txt *.doc

Isto substitui '.doc' no nome do arquivo por '.txt' para quaisquer arquivos terminados em .doc

O OSX não vem com renomeação, mas se você tiver o Perl instalado no OSX, você pode simplesmente copiar o script de renomeação para a sua máquina OSX a partir de uma instalação do Linux. A versão Perl é muito mais flexível que o util-linux (acima). Deve estar em / usr / bin / rename em distros do tipo Ubuntu. O script espera que o perl esteja em / usr / bin / perl, então você pode precisar editá-lo se estiver em outro lugar no OSX

    
por 22.11.2011 / 04:09
1

for f in *.doc; do cp "${f}" "${f//.doc/}-backup.doc"; done funcionará. Isso acrescentaria -backup.doc ao final de cada arquivo. ${f//.doc/} removerá todos os .docs do nome do arquivo original, assim você não terá o .doc. Pessoalmente, no entanto, quando faço um backup, apenas adiciono .bkup ao nome do arquivo, portanto, se eu quiser fazer backup de todos os .doc em um diretório para uma pasta de backup separada, navegue até a pasta que desejo cp de e fazer algo assim for f in *.doc; do cp "${f}" "~/backups/${f}.bkup"; done

    
por 22.11.2011 / 06:20