J'essaie de créer un script pour supprimer les fichiers dont les noms correspondent aux caractères génériques dans un fichier texte.
J'utilise le suivant
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"
dans le fichier list
il y a des lignes
file*
test*
Je reçois ce qui suit si je lance ce
rm: cannot remove ‘file*’: No such file or directory
rm: cannot remove ‘test*’: No such file or directory
Je pense que le * n'est pas accepté pour supprimer des fichiers tels que
file 1
file2
file2.txt
test 001 more teskt.txt
Désolé je ne suis pas un expert linux. Peut-être que quelqu'un a une réponse facile, peut-être remplacer le * par quelque chose?
Le développement du nom de chemin se produit après le développement de variable, mais uniquement sur des parties non citées de la ligne de commande.
rm -- $line # <- no double quotes to expand wildcards
Cela ne fonctionnerait pas pour les noms de fichiers contenant des espaces, car le fractionnement de Word se produit également après le développement de variables.
Vous pouvez utiliser Perl pour développer des globs:
Perl -lne 'unlink glob' -- list.txt
Normal glob nécessite des espaces blancs contre-obliques, mais vous pouvez passer à File :: Glob pour un comportement différent si cela vous convient mieux:
Perl -MFile::Glob=:bsd_glob -lne 'unlink glob' -- list.txt
Si vous ne supprimez que des fichiers dans le pwd (comme dans la question), vous pouvez remplacer rm
par find -name
comme ceci:
find . -maxdepth 1 -name "$line"
Cela ne donne que les noms de fichiers correspondant au glob. Si le résultat est correct, ajoutez -delete
à la fin.
Pour tout ce qui n'est pas couvert par la solution find
ci-dessus, cela devrait fonctionner:
python3 -c 'import glob, os, sys; [print(f) for f in glob.glob(sys.argv[1])]' "$line"
Si le résultat est correct, remplacez print
par os.remove
.
Ou vous pouvez écrire le script entier en Python:
#!/usr/bin/env python3
'''
For each line from "fileinput", treat it as a glob and delete
the matching files.
'''
import fileinput
import glob
import os
for line in fileinput.input():
line = line.rstrip('\n')
for file in glob.glob(line):
# If the output looks good, replace "print" with "os.remove"
print(file)
Notez bien que si aucun argument n'est fourni, fileinput
lit à partir de stdin au lieu d'erreur.