web-dev-qa-db-fra.com

Essayer de créer un script pour supprimer des fichiers de caractères génériques dans un fichier texte

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?

6
Marco

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
7
choroba

Trouver

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.


Python

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.

1
wjandrea