1 votes

Espace invisible lors de la tentative de suppression de fichier (mais exclure tous les fichiers d'une liste) ?

Je suis en train d'essayer d'accomplir une tâche simple en utilisant l'excellent post ici : J'aimerais supprimer tous les fichiers d'un dossier sauf ceux répertoriés dans un fichier .txt contenu dans le dossier. La syntaxe fonctionne bien, mais pour une raison quelconque tous les fichiers sont supprimés - en gros le script dit qu'il n'y a pas de correspondance entre les noms de fichiers dans le dossier et ceux dans le fichier .txt - mais je peux voir qu'il y en a !

Je pensais peut-être qu'il pourrait y avoir un espace blanc invisible après mes noms de fichier que je ne peux pas voir (dans le dossier ou le fichier .txt). Mais je ne pense pas... Y a-t-il une autre solution à laquelle je ne pense pas ?

2voto

Raffa Points 11919

Il semble que votre fichier a.txt contienne des caractères cachés en raison d'avoir potentiellement été créé ou modifié sur d'autres systèmes d'exploitation comme Windows.

Vous devez d'abord nettoyer le fichier afin de l'utiliser sans erreurs de syntaxe.

La manière la plus simple est d'utiliser un outil appelé dos2unix. Veuillez suivre ces étapes pour le faire :


Premièrement : Installez dos2unix en ouvrant un terminal et en exécutant la commande suivante :

sudo apt install dos2unix

Deuxièmement : Faites une sauvegarde de votre fichier a.txt.

Troisièmement : Utilisez dos2unix sur votre fichier en exécutant la commande suivante dans le terminal depuis le répertoire contenant votre fichier a.txt :

dos2unix a.txt

Enfin : Testez votre fichier. Il devrait fonctionner correctement maintenant.

0voto

bac0n Points 4841

Le script auquel vous faites référence donnera de faux positifs. for va étendre les noms de fichiers littéralement, cela signifie que les caractères spéciaux seront préservés et les utiliser comme modèle va casser la correspondance.

Exemple :

#!/bin/bash

# le script est adapté et légèrement raccourci.
shopt -s nullglob
for i in a* b*; do
   grep -Fx -e "$i" exclude.txt
done

Sortie:

$ ls
a   'a'$'\n''b'   b   exclude.txt

$ cat exclude.txt
a
b

$ script.sh
a
a
b
b

Une meilleure approche serait de conserver l'échappement du shell.

#!/bin/bash

shopt -s extglob

eval "list=( \
    $(ls --quoting-style=shell-escape !(exclude.txt) | \
        grep -vFx -f exclude.txt))"

for i in "${list[@]}"; do ls "$i"; done

Exemple :

$ cat exclude.txt  
'a'$'\n''b'

$ script.sh
a
b

$ cat exclude.txt  
a
b

$ script.sh
'a'$'\n''b'

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X