Como excluir arquivos listados em um arquivo de texto


23

Eu tenho um arquivo de texto que possui uma lista de caminhos para vários arquivos. Existe um comando que eu possa usar que irá percorrer cada linha e excluir o arquivo no caminho indicado?

Respostas:


33

Use xargs:

xargs rm < file  # or
xargs -a file rm

Mas isso não funcionará se os nomes / caminhos de arquivos contiverem caracteres que devem ser escapados.

Se seus nomes de arquivos não tiverem novas linhas, você poderá:

tr '\n' '\0' < file | xargs -0 rm # or
xargs -a file -I{} rm {}

Como alternativa, você pode criar o seguinte script:

#!/bin/bash

if [ -z "$1" ]; then
    echo -e "Usage: $(basename $0) FILE\n"
    exit 1
fi

if [ ! -e "$1" ]; then
    echo -e "$1: File doesn't exist.\n"
    exit 1
fi

while read -r line; do
    [ -n "$line" ] && rm -- "$line"
done < "$1"

Salve como /usr/local/bin/delete-from, conceda permissão de execução:

sudo chmod +x /usr/local/bin/delete-from

Em seguida, execute-o com:

delete-from /path/to/file/with/list/of/files

2
Resposta realmente limpa, mas catnão é necessária, você pode usar o stdinredirecionamento:< file xargs rm
kos

É dividir os nomes das pastas e depois procurá-las. Por exemplo, MINHA PASTA está sendo interpretada como "MINHA" e "PASTA"?
daka

@sudoman Resposta atualizada.
Eric Carvalho

Se os arquivos não tiverem espaços, você poderá apenas "rm - $ (arquivo cat)" no bash ou "rm - cat file" no (ba) sh ou csh.
shooper

O @shooper caté inútil , como acabamos de dizer, aproveite stdin! Veja sua resposta atualizada
kos 14/03

20

Aqui está uma maneira de lidar com nomes de arquivos com espaço em branco, barras invertidas e outros caracteres estranhos:

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

Isso lerá cada linha de list.txt, salvará como $filee executará rmnela. Os -rgarante que as barras invertidas são lidos literalmente (de modo que \tcorresponde a um \e um te não um TAB). Os --garante que ele também lida com nomes de arquivos começando com -.

Você também pode fazer isso no Perl:

perl -lne '$k{$_}++; END{unlink for keys(%k)}' list.txt

Este irá ler cada nome de arquivo no %khash e depois usá-lo unlinkpara excluir cada um deles.


10

Através de python.

import sys
import os
fil = sys.argv[1]
with open(fil) as f:
    for line in f:
        os.remove(line.rstrip('\n'))

Salve o script acima em um arquivo chamado like script.pye execute o script disparando o comando abaixo no terminal.

python3 script.py file

file é um arquivo de entrada em que o caminho dos arquivos que você realmente deseja remover são armazenados.


6
Ah, pelo menos você tem a coragem de postar uma resposta python :)
Jacob Vlijm

3

Bobo, mas aqui está um:

 tar -cvf /dev/null --remove-files -T filename

2

Outra maneira de fazer isso:

Você pode 'preparar' o arquivo transformando-o em um shell script:

$ sed -E "s/^(.*)$/rm '\1'/" input_file
rm 'file1'
rm 'file2'
rm 'file with some spaces.ext'

Se seus nomes de arquivos tiverem uma única citação ( '), você poderá usar esta versão ligeiramente expandida para escapar deles primeiro:

$ sed -E "s/'/'\\\''; s/^(.*)$/rm '\1'/" input_file
rm 'file1'
rm 'file2'
rm 'file with some spaces.ext'
rm 'a file with "quotes"'
rm 'a file with '\''quotes'\'''

E você pode executar isso canalizando-o para sh:

$ sed -E "s/'/'\\\''; s/^(.*)$/rm '\1'/" input_file | sh

1

Pelo que entendi, você tem um arquivo de texto com os arquivos com os caminhos completos. Existem duas possibilidades:

  1. Sua lista tem os nomes de arquivos separados por novas linhas, ou seja, cada linha tem o caminho completo para um arquivo. neste caso: aqui está uma saída simples:

    for i in $(cat listOfFiles.txt); do
        rm -f $i
    done
    
  2. Se sua lista tiver uma ou mais linhas de nomes de arquivos separadas por espaços ou tabulações, aqui está o detalhamento:

    sed -i 's/\s\+/\n/g' listOfFiles.txt
    

    isso converterá todos os espaços em branco em novas linhas

    for i in $(cat listOfFiles.txt); do
        rm -f $i
    done
    

Sim, existem várias maneiras de fazer isso, mas essa é uma abordagem muito simples.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.