Come eliminare file elencati in un file di testo

19

Ho un file di testo che ha un elenco di percorsi per vari file. C'è un comando che posso usare per scorrere ogni riga e cancellare il file nel percorso indicato?

    
posta daka 13.03.2015 - 21:53

6 risposte

30

Utilizza xargs :

xargs rm < file  # or
xargs -a file rm

Ma questo non funzionerà se i nomi / percorsi dei file contengono caratteri che dovrebbero essere sfuggiti.

Se i nomi dei file non hanno una nuova riga, puoi fare:

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 {}

In alternativa, puoi creare il seguente script:

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

Salvalo come /usr/local/bin/delete-from , concedilo permesso di esecuzione:

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

Quindi eseguilo con:

xargs rm < file  # or
xargs -a file rm
    
risposta data Eric Carvalho 13.03.2015 - 21:56
16

Ecco un modo in cui puoi gestire i nomi dei file con spazi bianchi, barre rovesciate e altri strani caratteri:

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

Questo leggerà ogni riga di list.txt , la salverà come $file ed eseguirà rm su di essa. Il -r garantisce che i backslash vengano letti letteralmente (in modo che \t corrisponda a \ e a t e non a un TAB). Il -- assicura che si occupi anche dei nomi di file che iniziano con - .

Potresti anche farlo in Perl:

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

Questo leggerà ciascun nome di file nell'hash di %k e quindi userà unlink per eliminarli.

    
risposta data terdon 14.03.2015 - 00:44
9

Attraverso python.

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

Salva lo script sopra in un file chiamato script.py e poi esegui lo script sparando il comando seguente sul terminale.

python3 script.py file

file è un file di input in cui sono memorizzati i percorsi dei file che si desidera rimuovere.

    
risposta data Avinash Raj 14.03.2015 - 09:46
2

Sciocco, ma eccone uno:

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

Un altro modo per farlo:

Puoi "preparare" il file rendendolo uno script di shell:

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

Se i tuoi nomi di file possono avere una singola citazione ( ' ), puoi usare questa versione leggermente espansa per sfuggire per primi:

$ 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 puoi eseguirlo collegandolo a sh :

$ sed -E "s/'/'\\''; s/^(.*)$/rm ''/" input_file | sh
    
risposta data Martin Tournoij 14.03.2015 - 01:19
1

A quanto ho capito, hai un file di testo con i file con i percorsi completi. Ci sono due possibilità:

  1. La tua lista ha i nomi dei file separati da una nuova riga, cioè ogni riga ha il percorso completo di un file. in questo caso: ecco una semplice via d'uscita:

    for i in $(cat listOfFiles.txt); do
        rm -f $i
    done
    
  2. Se il tuo elenco ha una o più righe di nomi di file separate da spazi o tabulazioni, ecco il trapano:

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

    questo convertirà tutti gli spazi bianchi in nuove righe

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

Sì, ci sono molti modi per farlo, ma questo è un approccio molto semplice.

    
risposta data Hopping Bunny 20.03.2015 - 06:05

Leggi altre domande sui tag