Como excluir arquivos listados em um arquivo de texto

17

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

    
por daka 13.03.2015 / 21:53

6 respostas

28

Use xargs :

xargs rm < file  # or
xargs -a file rm

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

Se os seus nomes de arquivo não têm novas linhas, você pode fazer:

tr '\n' '
#!/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"
' < file | xargs -0 rm # or xargs -a file -I{} rm {}

Como alternativa, você pode criar o seguinte script:

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

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

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

Em seguida, execute-o com:

xargs rm < file  # or
xargs -a file rm
    
por Eric Carvalho 13.03.2015 / 21:56
16

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 $file e executará rm nela. O -r garante que as barras invertidas sejam lidas literalmente (para que \t corresponda a \ e t e não a TAB). O -- garante que ele também lide com nomes de arquivos que começam com - .

Você também pode fazer isso em Perl:

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

Esta pessoa irá ler cada nome de arquivo no %k hash e então usar unlink para deletar cada um deles.

    
por terdon 14.03.2015 / 00:44
9

Através do 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 script.py e execute o script acionando o comando abaixo no terminal.

python3 script.py file

file é um arquivo de entrada no qual o caminho dos arquivos que você deseja remover é armazenado.

    
por Avinash Raj 14.03.2015 / 09:46
2

Bobo, mas aqui está um:

 tar -cvf /dev/null --remove-files -T filename
    
por shooper 14.03.2015 / 01:18
2

Outra maneira de fazer isso:

Você pode "preparar" o arquivo fazendo um script de shell:

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

Se seus nomes de arquivos podem ter uma única aspa ( ' ), você pode usar esta versão ligeiramente expandida para escapar deles primeiro:

$ sed -E "s/'/'\\''; s/^(.*)$/rm ''/" 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 ''/" input_file | sh
    
por Martin Tournoij 14.03.2015 / 01:19
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 a sua lista tiver uma ou mais linhas de nomes de arquivos separadas por espaços ou tabulações, aqui está o drill:

    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 muitas maneiras de fazê-lo, mas essa é uma abordagem muito simples.

    
por Hopping Bunny 20.03.2015 / 06:05