web-dev-qa-db-fra.com

Comment supprimer des fichiers listés dans un fichier texte

J'ai un fichier texte qui contient 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 dans le chemin indiqué?

22
daka

Utilisez xargs :

xargs rm < file  # or
xargs -a file rm

Mais cela ne fonctionnera pas si les noms de fichiers/chemins contiennent des caractères à échapper.

Si vos noms de fichiers n'ont pas de nouvelles lignes, vous pouvez faire:

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

Vous pouvez également 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 le droit d'exécution:

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

Puis lancez-le avec:

delete-from /path/to/file/with/list/of/files
33
Eric Carvalho

Voici un moyen 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 en tant que $file et exécuter rm dessus. Le -r garantit que les barres obliques inverses sont lues littéralement (de sorte que \t correspond à un \ et à un t et 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 hash %k et utilisera ensuite unlink pour supprimer chacun d’eux.

19
terdon

À travers le 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é script.py, puis exécutez-le en lançant 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é.

10
Avinash Raj

Silly, mais en voici un:

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

Une autre façon de faire ceci:

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 fichier 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 exécuter ceci en le connectant à sh:

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

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

  1. Votre liste contient les noms de fichiers séparés par des nouvelles lignes, c’est-à-dire que chaque ligne contient le chemin complet du 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, alors voici l'exploration:

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

    cela convertira tous les espaces en nouvelles lignes

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

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

1
Hopping Bunny