Supposons que j'ai un dossier contenant .txt , .pdf et d'autres fichiers. Je voudrais lister les "autres" fichiers (c'est-à-dire les fichiers n'ayant pas les extensions .txt ou .pdf ). Avez-vous des conseils sur la façon de procéder?
Je sais comment lister les fichiers n'ayant pas d'extension donnée. Par exemple, si je veux répertorier tous les fichiers à l'exception des fichiers .txt , alors soit
find -not -iname "*.txt"
ou
ls | grep -v '\.txt$' | column
semblent fonctionner. Mais, comment puis-je lister tout sauf les fichiers .txt ou les fichiers .pdf ? Il semble que je doive utiliser une sorte de "ou" logique dans find
ou grep
.
ls
vsfind
vs globbing peut différer pour les fichiers dot cachés.find
traversera les sous-répertoires, comme un récursifls
. Utilisez-maxdepth 1
avecfind
pour qu'il se comporte plus commels
.Réponses:
En supposant que l'on dispose d'une version appropriée de
ls
, c'est probablement la manière la plus simple:Si vous souhaitez parcourir tous les sous-répertoires:
la source
ls
options GNU ne sont pas portables.ls
n'appartient pas vraiment aux scripts portables de toute façon, donc je suppose que l'OP pose des questions sur l'utilisation interactive uniquement.Trouver des supports
-o
Vous avez besoin des parenthèses pour faire la priorité. Find fait beaucoup de choses; Je suggère de lire sa page de manuel.
Vous pouvez également faire un ou dans
grep
(mais vraiment, vous nels
devez pas analyser la sortie de )la source
ls
?find
page de manuel, je recommande sans réserve les articles Unix Power Toolsfind
, tels que docstore.mik.ua/orelly/unix3/upt/ch09_06.htm et docstore.mik.ua/orelly/unix3/upt/ch09_12.htmfind . NOT ( *.txt OR *.pdf )
Avec
bash
un globbing étendu (activer avecshopt -s extglob
), le glob!(*.txt|*.pdf)
devrait fonctionner. Vous pouvez transmettre ce glob directement à n'importe quelle commande qui accepte des arguments de fichier, y compris mais sans s'y limiterls
.la source
-d
pour éviter cela:ls -d !(*.txt|*.pdf)
En
zsh
avecextendedglob
:ou
Ou avec
kshglob
(oui, c'est ksh globbing pas "bash extended globbing"):N'oubliez pas que ceux-ci excluent également les fichiers dot.
ksh93 a la
FIGNORE
(mauvaise) fonctionnalité:la source
Cela équivaut à la commande avec l'opérateur OR, en raison des lois de De Morgan .
la source
Comme suggéré par derobert, votre meilleur pari est d'utiliser
find
. Cependant, vous pouvez en fait utiliser le résultat dans un pipeline avec d'autres commandes.GNU (et certains BSD)
find
prennent en charge le-print0
prédicat qui lui indique d'imprimer le nom de fichier terminé par un caractère NUL , lequel caractère n'est pas autorisé dans un nom de fichier et garantit qu'il n'y aura pas de collision. D'autres commandes peuvent être chargées d'utiliser le NUL comme délimiteur d'entrée.Le plus important est GNU
xargs
, qui exécute la commande que vous spécifiez et lui transmet la liste des fichiers comme arguments de ligne de commande. Vous souhaitez exécuterxargs -r0
conjointement avec find-print0
Par exemple:Cela imprime en toute sécurité une longue liste de répertoires de tous les fichiers pdf et txt , y compris ceux avec des espaces ou des caractères non imprimables dans le nom.
Vous pouvez également l'utiliser avec GNU
tar
comme suit:Cela crée un fichier tar.gz de tous les fichiers dont les noms ne se terminent pas par .tar.gz
rsync
accepte également les fichiers délimités par des valeurs nulles avec le-0
paramètre, tout comme plusieurs autres. Maisxargs
c'est la colle que vous utiliserez habituellement pour ce type de but. Soit cela, soitfind
la-exec
fonctionnalité de.la source
tar
exemple de commande est bon. Pour la plupart des objectifs, cependant,-exec
est un meilleur ajustement.Si vous n'avez pas de sous-répertoire
devrait également fonctionner!
Mais
est la voie commune.
la source
En complément, si vous utilisez un shell compatible bash, vous pouvez utiliser la variable GLOBIGNORE pour exclure les résumés de la correspondance de modèle. De l'homme:
Dans votre cas particulier:
Veuillez noter que j'exécute cette commande en tant que sous-shell (en utilisant des parenthèses) afin de ne pas modifier la variable d'environnement GLOBIGNORE de mon shell interactif.
la source