Comment supprimer des fichiers répertoriés dans un fichier texte

23

J'ai un fichier texte qui a une liste de chemins d'accès à divers fichiers. Existe-t-il une commande que je peux utiliser pour parcourir chaque ligne et supprimer le fichier au chemin indiqué?

daka
la source

Réponses:

33

Utilisation xargs:

xargs rm < file  # or
xargs -a file rm

Mais cela ne fonctionnera pas si les noms / chemins de fichiers contiennent des caractères qui doivent être échappés.

Si vos noms de fichiers n'ont pas de nouvelle ligne, vous pouvez faire:

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

Alternativement, vous pouvez créer le script suivant:

#!/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"

Enregistrez-le sous /usr/local/bin/delete-from, accordez-lui l'autorisation d'exécution:

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

Exécutez-le ensuite avec:

delete-from /path/to/file/with/list/of/files
Eric Carvalho
la source
2
Réponse vraiment propre, mais catpas obligatoire, vous pouvez utiliser la stdinredirection:< file xargs rm
kos
Il divise les noms des dossiers et les recherche. Par exemple, MON DOSSIER est interprété comme "MON" et "DOSSIER"?
daka
@sudoman Réponse mise à jour.
Eric Carvalho
Si les fichiers n'ont pas d'espace, vous pouvez simplement "rm - $ (fichier cat)" dans bash ou "rm - cat file" dans (ba) sh ou csh.
shooper
@shooper catest inutile, comme je viens de le dire, profitez-en stdin! Regardez sa réponse mise à jour
kos
20

Voici une façon de gérer les noms de fichiers avec des espaces, des barres obliques inverses et d'autres caractères étranges:

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

Cela va lire chaque ligne de list.txt, l'enregistrer sous $fileet l'exécuter rm. Le -rgarantit que les barres obliques inverses sont lues littéralement (de façon à ce qu'elles \tcorrespondent à a \et à tet non à une tabulation). Le --garantit qu'il traite également les noms de fichiers commençant par -.

Vous pouvez également le faire en Perl:

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

Celui-ci lira chaque nom de fichier dans le %khachage puis utilisera unlinkpour supprimer chacun d'eux.

terdon
la source
10

Par python.

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

Enregistrez le script ci-dessus dans un fichier nommé like script.py, puis exécutez le script en exécutant la commande ci-dessous sur le terminal.

python3 script.py file

file est un fichier d'entrée dans lequel le chemin des fichiers que vous souhaitez réellement supprimer est stocké.

Avinash Raj
la source
6
Ah, au moins vous avez le courage de poster une réponse en python :)
Jacob Vlijm
3

Idiot, mais en voici un:

 tar -cvf /dev/null --remove-files -T filename
shooper
la source
2

Une autre façon de procéder:

Vous pouvez «préparer» le fichier en en faisant un script shell:

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

Si vos noms de fichiers peuvent avoir un guillemet simple ( '), vous pouvez utiliser cette version légèrement développée pour les échapper en premier:

$ 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'\'''

Et vous pouvez l'exécuter en le redirigeant vers sh:

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

Si je comprends bien, vous avez un fichier texte avec les fichiers avec les chemins d'accès complets. Il y a deux possibilités:

  1. Votre liste contient les noms de fichiers séparés par des sauts de ligne, c'est-à-dire que chaque ligne a le chemin complet vers un fichier. dans ce cas: voici une solution simple:

    for i in $(cat listOfFiles.txt); do
        rm -f $i
    done
    
  2. Si votre liste contient une ou plusieurs lignes de noms de fichiers séparés par des espaces ou des tabulations, voici l'exploration:

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

    cela convertira tous les espaces blancs en nouvelles lignes

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

Oui, il existe de nombreuses façons de le faire, mais c'est une approche très simple.

Hopping Bunny
la source