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
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?
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
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[@]}"
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
xargs farão, 'algo', com uma lista de algumas coisas ...
cat file_containing_list_of_files_to_delete.txt | xargs rm
touch file1
cat foo
file1
file2
file3
cat foo | xargs rm
rm: cannot remove 'file2': No such file or directory
rm: cannot remove 'file3': No such file or directory
ls file1
ls: cannot access file1: No such file or directory
Tags bash shell-script newlines