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é?
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
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.
À 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é.
Silly, mais en voici un:
tar -cvf /dev/null --remove-files -T filename
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
Si je comprends bien, vous avez un fichier texte avec les fichiers avec les chemins complets. Il y a deux possibilités:
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
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.