GNU/Linux >> Tutoriels Linux >  >> Linux

Obtenir le complément du résultat d'une commande Ls ?

Disons que j'ai un répertoire avec plusieurs fichiers, qui sont tous soit des fichiers binaires (fichiers sans extensions déclarées) et des fichiers source (.c extension). Je fais ceci :

$ ls

et obtenez :

README.md hello-world.c hello-world get-name.c get-name

et je veux lister uniquement les fichiers avec une extension spécifique (dites à la fois .c et .md ), je fais :

ls *.c *.md

et c'est bon !

Mais que se passe-t-il si maintenant je veux supprimer tous les fichiers qui ne le font pas avoir un .c ou .md extension, comment puis-je faire cela ?

Je sais comment le faire pour les fichiers dont les extensions me sont connues, comme :

ls *.c *.md | xargs rm

Mais comment dire à la ligne de commande de supprimer les fichiers qui NE PAS correspond à mes critères ?

Réponse acceptée :

Utilisez find :

find -maxdepth 1 ! -name "*.c" -print0 | xargs -0 ...

Notez que -maxdepth , -print0 , -r et -0 se trouvent dans quelques find implémentations (ont été introduites par GNU find /xargs ) mais ne sont pas spécifiés par POSIX. Une autre façon est, comme Stéphane l'a mentionné dans son commentaire, d'utiliser le -exec action de trouver - n'oubliez pas d'utiliser la commande -exec command {} + forme, car il réduit considérablement le nombre d'invocations de command (il doit autoriser la syntaxe où les noms de fichiers sont placés à la fin, sinon vous devez envelopper la command dans un sh -c appel).

Alternativement grep la sortie de ls

ls | grep -v ".c$" | xargs ...

Vous pouvez filtrer plusieurs extensions soit avec des expressions régulières :

... | grep -v ".(c|md)$" | ...

avec des expressions régulières étendues :

... | grep -Ev ".(c|md)$" | ...

avec l'option de chaînes fixes (ne correspondra pas uniquement à la fin du nom de fichier !) :

... | grep -vF ".c
.md" | ...

ou en enchaînant plus de grep s :

... | grep -v ".c$" | grep -v ".md$" | ...

Cela dit, find est probablement la meilleure option, car avec le -print0 option il gère tous les caractères possibles dans les noms de fichiers qui pourraient avoir besoin d'être échappés autrement (à condition que votre find et xargs sont capables de travailler avec des chaînes terminées par NULL - par ex. les outils GNU le sont).


Linux
  1. Soyez trié avec sort en ligne de commande

  2. Le Résultat De Ls * , Ls ** Et Ls *** ?

  3. Quelle est la différence entre obtenir la sortie de la commande en utilisant `command` et $ (commande) dans Shell ??

  4. La commande locate sous Linux

  5. Comment puis-je obtenir mon adresse IP à partir de la ligne de commande ?

Apprenez à connaître votre système (en utilisant la ligne de commande)

Guide Ansible :la commande ad hoc

La commande Linux tar expliquée

8 façons d'obtenir de l'aide sur le shell Linux

Comment obtenir le nombre de processeurs/cœurs sous Linux

La commande timer sous Linux