Script de shell para excluir vários arquivos

1

Então, eu tenho um arquivo que contém uma lista de centenas de arquivos que precisam ser excluídos de vários diretórios. Imaginei que o método mais fácil seria criar um arquivo de lote, mas não estou tendo muito sucesso.

#/bin/bash
rm "/home/e-smith/files/users/bill/Maildir/cur/1392373930.28512.comp01:2,S"
rm "/home/e-smith/files/users/ted/Maildir/cur/1420726198.17690.comp01:2,S"

Mas quando eu corro o script com

./myfile.txt

Eu obtenho

rm: cannot remove '/home/e-smith/files/users/bill/Maildir/cur/1392373930.28512.comp01:2,S\r': no such file or directory
rm: cannot remove '/home/e-smith/files/users/ted/Maildir/cur/1420726198.17690.comp01:2,S\r': no such file or directory

Eu não entendo de onde o \r está vindo, suponho que seja um retorno de carro, mas ele se anexa ao comando.

Qual é o método / sintaxe correto para um exercício como este?

    
por pickles 05.02.2015 / 11:51

4 respostas

4

Isso se deve aos fins de linha que o Windows usa ( \r\n ).

Você pode remover os itens via vi :

$ vi myfile.txt
<ESC>
:set fileformat=unix
:wq
    
por 05.02.2015 / 13:29
4

Se você tem uma lista de centenas de nomes de arquivos e deseja excluí-los, não há motivo para escrever comandos rm separados para cada um deles. Presumindo que seus nomes de arquivo foram salvos em um arquivo chamado list.txt , um por linha e que eles não contêm caracteres de nova linha , você poderia fazer

while read -r file; do rm "$file"; done < list.txt 

Explicação

  • A construção while read variable; do something; done < file lerá cada linha de um arquivo e a salvará como variable (no exemplo acima, o nome da variável é file ). O -r é necessário para permitir nomes de arquivos contendo itens como \r ou \t . Com o -r , eles serão tratados literalmente, mas sem ele serão expandidos para um retorno de carro ou uma tabulação, respectivamente.
  • rm "$file" : isso removerá cada arquivo da lista conforme for lido.

Você também pode usar o mapfile builtin do bash, que permite salvar as linhas de um arquivo em uma matriz:

mapfile -t filelist < list.txt && rm "${filelist[@]}"
    
por 05.02.2015 / 18:12
2

Obrigado pelas respostas, a razão técnica para isso é provavelmente no arquivo de codificação em algum lugar, mas para corrigir eu simplesmente criei o meu arquivo na caixa CentOS

$> touch myfile.txt
$> nano myfile.txt

Adicionado o "!" no meu script bash (obrigado @jimmij)

#!/bin/bash

E, depois, salvei o bloco de notas ++ no Windows para adicionar os arquivos que queria remover, de acordo com minha sintaxe inicial e bingo.

Obrigado pelas sugestões @Marko Frelih, @jimmij

    
por 05.02.2015 / 13:29
1

xargs farão, 'algo', com uma lista de algumas coisas ...

cat file_containing_list_of_files_to_delete.txt | xargs rm

faça um arquivo

touch file1

procure neste arquivo chamado foo

cat foo

file1
file2
file3

apague os arquivos mencionados no arquivo foo.

cat foo | xargs rm

rm: cannot remove 'file2': No such file or directory
rm: cannot remove 'file3': No such file or directory

file1 foi agora.

ls file1
ls: cannot access file1: No such file or directory
    
por 16.11.2017 / 14:37