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é?

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

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.


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é.


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

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

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.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.