Réponses:
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
cat file
" dans (ba) sh ou csh.
cat
est inutile, comme je viens de le dire, profitez-en stdin
! Regardez sa réponse mise à jour
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 $file
et l'exécuter rm
. Le -r
garantit que les barres obliques inverses sont lues littéralement (de façon à ce qu'elles \t
correspondent à a \
et à 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 %k
hachage puis utilisera unlink
pour supprimer chacun d'eux.
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é.
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
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:
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
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.
cat
pas obligatoire, vous pouvez utiliser lastdin
redirection:< file xargs rm