Évitez de répertorier les fichiers se terminant par ~ (fichiers de sauvegarde)


20

Mon exigence est de lister tous les fichiers dans un répertoire, à l'exception des fichiers se terminant par ~(fichiers de sauvegarde).

J'ai essayé d'utiliser la commande:

ls -l | grep -v ~    

J'obtiens cette sortie:

asdasad
asdasad~
file_names.txt
normaltest.txt
target_filename
testshell1.sh
testshell1.sh~
testshell2.sh
testshell2.sh~
testtwo.txt
testtwo.txt~
test.txt
test.txt~

Je souhaite obtenir uniquement ces fichiers:

asdasad
file_names.txt
normaltest.txt
target_filename
testshell1.sh
testshell2.sh
testtwo.txt
test.txt

Il semble que vous essayiez d'éviter de répertorier les fichiers qui se terminent par un ~. Ces fichiers sont des fichiers de sauvegarde créés par certains éditeurs de texte.
ctrl-alt-delor

Quel système d'exploitation utilisez-vous: est-ce un Gnu / Linux (tel que Debian, Ubuntu, Redhat, Centos, Fedora, Suse, Mint, Arch,…)?
ctrl-alt-delor

2
Notez que le fichier que vous souhaitez ignorer semble être des fichiers de sauvegarde Emacs. Il est assez facile de changer le comportement d'Emacs pour qu'il enregistre les sauvegardes dans un répertoire centralisé et pas partout; voir emacs.stackexchange.com/questions/33/…
Kilian Foth

Je suis désolé d'être méchant mais je ne vous crois pas; ls -l(lettre ell) comprendrait les autorisations, les liens, le propriétaire, la taille et l'heure de modification pour chaque fichier répertorié. Ce qui produirait la sortie que vous montrez est ls -1(chiffre un) et sur de nombreux systèmes -1est nécessaire pour produire une sortie à une seule colonne sur le terminal , mais quand il lsest canalisé (comme ici grep) ou redirigé, -1n'est pas nécessaire, il est déjà à une seule colonne .
dave_thompson_085

@ dave_thompson_085 J'ai tronqué tout le texte, et seulement les noms de fichiers ici .. Parce que je sentais que cela n'avait pas d'importance. Et c'est aussi un système de production (pas mon propre système). Donc, je ne veux pas répertorier les noms d'utilisateur, les détails et les divulguer.
curious_one

Réponses:


49
ls -l | grep -v ~

La raison pour laquelle cela ne fonctionne pas est que le tilde est étendu à votre répertoire personnel, donc grepne voit jamais un tilde littéral. (Voir par exemple le manuel de Bash sur l'extension Tilde .) Vous devez le citer pour empêcher l'expansion, c.-à-d.

ls -l | grep -v "~"

Bien sûr, cela supprimera toujours toutes les lignes de sortie avec un tilde n'importe où, même au milieu d'un nom de fichier ou ailleurs dans la lssortie (bien qu'il ne soit probablement pas susceptible d'apparaître dans les noms d'utilisateur, les dates ou autres). Si vous voulez vraiment ignorer les fichiers qui se terminent par un tilde, vous pouvez utiliser

ls -l | grep -v "~$"

48

L'implémentation GNU de ls(présente sur la plupart des systèmes Linux) a une option pour cela: -BIgnorer les sauvegardes:

ls --ignore-backups

24

Si vous utilisez bash, assurez-vous qu'il extglobest activé:

shopt -s extglob

Ensuite, vous pouvez utiliser:

ls -d -- !(*~)
  • -d pour ne pas afficher le contenu des répertoires
  • !(*~) tous les fichiers sauf ceux se terminant par ~

Sur zsh, vous pouvez faire de même avec l' kshgloboption ou en utilisant ses propres globs étendus:

setopt extended_glob
ls -d -- ^*~

Étant donné que le suffixe à exclure ne comporte qu'un seul caractère, vous pouvez également faire correspondre les noms de fichiers où le dernier caractère n'est pas le tilde (cela devrait également fonctionner sans extglob):

ls -d -- *[^~]

Mais l'idée générale est d'utiliser ls --ignore-backups.


12

Cela devrait aider:

ls -l | grep -v '~'  

Motif: le caractère ~ est remplacé par votre répertoire personnel avant l'exécution de la commande. Essayer

echo ~

et

echo '~'

6

Comme mentionné dans d'autres réponses, la raison pour laquelle vous rencontrez probablement des problèmes est que vous n'avez pas cité ou échappé au tilde.

Pour un cas d'utilisation particulier, j'ai utilisé l'expansion du nom de fichier shell pour faire quelque chose de similaire. Je l'utilise depuis environ 2003, ce qui signifie qu'il a travaillé sur une très grande variété d'implémentations de shell sur différents types de systèmes. (ici j'utilise aussi -Cparce que je veux un bel affichage en colonnes triées)

ls -C *[!~]

(une limitation de l'utilisation de l'expansion du nom de fichier shell est bien sûr qu'un répertoire avec un très grand nombre de fichiers (non de sauvegarde) entraînera une expansion dépassant la taille de la liste d'arguments disponible, bien que sur la plupart des systèmes modernes cette limite soit assez élevée, souvent 250 Ko ou plus, parfois beaucoup plus)


1

ls | grep -v '~$'est la solution rapide. Il utilise ls pour lister tous les fichiers (non cachés), puis utilise grep avec -v(correspondance inversée, c'est-à-dire exclusion) pour exclure toutes les lignes avec le tilde ( ~) à la fin ( $).

CEPENDANT, si vous avez des fichiers nommés comme quelque chose1, quelque chose2, c'est un ÉNORME indicateur nauséabond que vous avez un mauvais flux de travail, que vous devez corriger à la source, pas avec des hacks maladroits comme la modification du fonctionnement de ls.

Si vous vous retrouvez à nommer des fichiers avec des numéros de version, comme test1 et test2 ou testone et testtwo, alors ce que vous voulez vraiment, c'est un système de contrôle de version, comme git.

Cela est particulièrement vrai dans votre cas, lorsque vous disposez de plusieurs versions de plusieurs fichiers et que le contrôle de version semble devoir être coordonné entre tous les fichiers.

Les systèmes de contrôle de version vous permettent de superposer essentiellement une fenêtre temporelle sur le système de fichiers, de sorte que vous ne voyez qu'un seul testfichier, mais sous le capot (via le programme de contrôle de version), toutes les versions sont disponibles pour rechercher, récupérer, revenir à, comparer avec, etc. .

Une fois que vous avez configuré cela, vous n'avez plus besoin de fichiers de sauvegarde de votre éditeur, car le contrôle de version a l'historique des fichiers depuis que vous avez commencé à l'utiliser, même si vous avez effectué mille modifications depuis. Vous pouvez même "brancher" la chronologie de l'historique, essayer une nouvelle idée, remonter dans le temps et ensuite avancer pour essayer une autre idée, si vous en avez besoin.


1

Bien que de nombreuses réponses soient correctes (j'aime @Fooncelle en particulier), je noterais que l'obtention de la liste des noms ls -lest un peu boiteux pour diverses raisons.

Sans surprise, l'outil approprié pour rechercher des fichiers est find.

L'un de ses résultats est qu'il est capable de gérer lui-même la "logique de sélection", par exemple:

$ find . -maxdepth 1 \( -type f -a \! -name '*~' \) -print

qui dit littéralement find:

  1. Recherchez les fichiers dans le répertoire actuel: .
  2. Recherchez-les uniquement au niveau de ce répertoire, c'est-à-dire, ne récurez pas: -maxdepth 1
  3. Là, recherchez les entités qui

    • du fichier type: -type f
    • et: -a
    • dont les noms ne se terminent pas par ~: ! -name *~ (où le !nie la directive suivante qui correspond aux noms de fichiers, -name *~).

    (Pour que la correspondance complète sur le type et le nom apparaisse comme une unité logique, elle est entre parenthèses avec (et )).

  4. Imprimer le nom de chaque fichier trouvé: -print.

Vous devez protéger certains caractères qui sont spéciaux pour le shell d'être interprétés par le shell, et c'est pourquoi les parenthèses et le bang !, sont échappés par une barre oblique inverse, et le modèle de nom *~, est entouré de guillemets simples.

La findcommande possède un mini-langage très puissant grâce à l'utilisation de ses options. Par exemple, il peut être conseillé de traiter récursivement une arborescence (ou des arborescences) de système de fichiers complète, mais d'omettre certains répertoires lors de l'analyse. Il est possible de faire correspondre plusieurs attributs des fichiers, tels que l'heure de création ou de modification ou la taille de quoi que ce soit.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.