Excluindo arquivos usando correspondência de padrões para arquivos que contenham espaços e asteriscos

0

Devido a um programa que não estava funcionando bem, eu tenho muitos arquivos em meu diretório inicial, começando com um ponto e contendo símbolos estranhos, entre os quais espaços e asteriscos. Eu quero excluir esses arquivos, mas estou com problemas para fazer isso. Esse problema é semelhante a Renomear arquivo contendo espaços e sinais de pontuação , mas muito pior. Existem muitos arquivos para serem removidos manualmente, então terei que usar a correspondência de padrões.

A maioria dos arquivos começa com .txt} e contém 18Jun22h (e nenhum arquivo no diretório que desejo manter contém uma dessas cadeias). Como faço para remover todos os arquivos que contêm essa string, dado que os arquivos no diretório não são, com certeza, um bom nome de unix? Em vez disso, eles contêm espaços com asteriscos, colchetes e traços. Minhas tentativas iniciais estão falhando presumivelmente devido à presença desses símbolos nesses nomes.

Qualquer método que os exclua um por um seria completamente inútil para mim devido à quantidade de arquivos.

Sim, sei que é melhor não ter arquivos que não correspondam ao padrão unix. Este é um código que eu também vivo. Mas um script não funcionou como deveria.

Como um segundo pensamento, pode ser mais fácil excluir todos os arquivos produzidos (no diretório específico) entre determinados horários. Então, alternativamente, ajuda com isso é apreciado.

Sistema: Fedora 27

Eu tentei ~/*18Jun22h* , mas achei que o erro dizendo que o argumento era muito longo tinha a ver com os * nos nomes de arquivos se expandindo e fazendo algo estranho. Em vez disso, é porque há muitos arquivos correspondentes a esse padrão (certo?). (Eu não sabia que há um máximo no número de arquivos que o rm pode manipular).

    
por Kvothe 25.06.2018 / 20:00

5 respostas

3

Para localizar arquivos no diretório inicial (somente) que contenha pelo menos um espaço:

find "$HOME" -maxdepth 1 -type f -name '*[ ]*'

... que contém pelo menos um * :

find "$HOME" -maxdepth 1 -type f -name '*[*]*'

... que contém pelo menos [ ou ] :

find "$HOME" -maxdepth 1 -type f -name '*[\[\]]*'

... que contém um dos itens acima:

find "$HOME" -maxdepth 1 -type f -name '*[ *\[\]]*'

Para excluir esses arquivos, adicione -delete ao final do comando ou -exec rm {} + .

Em sistemas em que find não suporta -maxdepth 1 , em execução no diretório inicial:

find . -type d ! -name . -prune -o -type f -name '*[ *\[\]]*' -print
    
por 25.06.2018 / 20:20
1

Como nenhum dos .txt} é especial para o shell (não há chave de abertura), simplesmente:

rm ~/.txt}* ~/*18Jun22h*

ou se houver muitos, divida-o:

rm ~/.txt}*
rm ~/*18Jun22h*
    
por 25.06.2018 / 20:39
0

Você pode entrar e sair de citações.

Por exemplo para remover um arquivo começando com * , então faça

rm "*"*

Pratique com echo first echo "*"*

    
por 25.06.2018 / 20:07
0

Você pode obter os nomes de arquivos para arquivos que contêm uma determinada expressão com grep -l , por exemplo, grep -l '18Jun22h' * . Você pode usar --null para passar um caractere nulo entre os arquivos e enviá-lo para xargs :

$ grep -l '18Jun22h' * --null | xargs -0 rm --

Eu recomendaria fazer primeiro uma verificação de sanidade, como com a demonstração "criar e remover os arquivos":

$ for file in 'test file' 'file?name' 'file*name'; do echo foo > "$file"; done; ls -1
file*name
file?name
test file
$ grep -l foo * --null | xargs -L1 -0 echo
file*name
file?name
test file
$ grep -l foo * --null | xargs -L1 -0 rm --
    
por 25.06.2018 / 20:09
0

Caminho 1: usando ./

rm -f ./'file name' e rm -f ./'file*name'

Caminho 2: usando inode:

Obtenha o inode de ls

ls -i "file name"

então

find . -inum "numberoofinode" -exec rm {} \;

    
por 25.06.2018 / 20:59