Renomear ou excluir em massa no Linux

3

Eu tenho um monte (cerca de 10 GB de valor) de arquivos que eu preciso copiar de um disco Linux externo para uma máquina Windows. Infelizmente, alguns nomes de arquivos que contêm o caractere ":" entraram nesta coleção.

Nenhum desses arquivos de cólon precisa estar na máquina do Windows, por isso preciso de uma solução rápida para zap ou renomeá-los.

O que todos vocês recomendariam? (Estou assumindo algo como um script bash / perl / python no Linux. Não temos o powershell na máquina Windows.)

    
por interstar 27.07.2009 / 13:15

7 respostas

16

Revise os arquivos incorretos.

find /path/to/files -name '*:*' -print

Exclua os arquivos incorretos.

find /path/to/files -name '*:*' -exec rm {} +

Renomeie os arquivos ofensivos com um sublinhado.

find /path/to/files -name '*:*' -exec rename ':' '_' {} +
    
por 27.07.2009 / 13:22
5

Para uma versão mais eficiente do Dan C, exclua algumas variantes do UNIX:

find /path/to/files -name '*:*' -delete

isso evita a necessidade de bifurcar e executar /bin/rm para cada arquivo correspondente.

Esta opção -delete está presente no MacOS X e no meu sistema FC11 (com findutils-4.4.0 ). Não sei há quanto tempo foi adicionado a findutils .

    
por 27.07.2009 / 16:52
0

Você pode excluir todos os arquivos fazendo

rm *:*

no diretório na caixa do Linux.

Isso deve excluir todos os arquivos que contêm os dois pontos.

Ou você pode renomeá-los usando o comando renomear

rename 'y/(.*):(.*)/$1$2/' *

Isso substituirá teste: algo para ser testado

    
por 27.07.2009 / 13:18
0

A maneira mais fácil pode ser zipar toda a estrutura e descompactar o arquivo no disco do Windows. O Unzip sabe como remapear caracteres ilegais.

Requer que você tenha o espaço em disco: (

    
por 27.07.2009 / 19:07
0

Se você quiser mudar os nomes dos arquivos em vôo (não modificando o diretório fonte), o GNU tar tem uma opção --transform.

tar cf - -C $SOURCE_DIR . --transform=s/:/_/g | tar xf - -C $DEST_DIR

Você também pode usar a opção --exclude para evitar esses arquivos.

tar cf - -C $SOURCE_DIR . --exclude='*:*' | tar xf - -C $DEST_DIR

Não vejo a opção --transform nas máquinas RHEL5 em que trabalho, mas acho que é bem comum em contrário.

    
por 31.07.2009 / 23:54
0

Além disso,

mmv ";*:*" "#1#2#3"

ou um comando similar deve fazer o truque também. Execute-o com -nv primeiro, apenas para ver o que será movido para o que, sem realmente modificar nada

    
por 05.08.2009 / 16:09
0

Isso deve ser realmente um comentário sobre a resposta mais escolhida acima, mas não posso (ainda) aplicar um comentário.

Eu tenho essa versão de renomear em um sistema jessie do Debian.

$ rename -V
/usr/bin/rename using File::Rename version 0.20

Tive êxito ao renomear usando:

find . -name '*:*' -exec rename 's/:/_/g' {} \;

No entanto, existe um efeito colateral. Os timestamps em todos os arquivos foram alterados.

    
por 08.03.2016 / 01:13