Liste des fichiers ne correspondant pas à la chaîne donnée dans le nom de fichier

16

J'ai un répertoire dans lequel de nombreux fichiers (environ 200) avec le nom temp_log.$$sont créés avec plusieurs autres fichiers importants que je dois vérifier.

Comment puis-je facilement répertorier tous les fichiers et empêcher temp_log.$$leur affichage?

Production attendue

$ ls -lrt <exclude-filename-part>
-- Lists files not matching the above given string

J'ai parcouru la lspage de manuel mais je n'ai rien trouvé dans cette référence. Veuillez me faire savoir si j'ai oublié des informations vitales ici.

Merci

mtk
la source
en BASH, ls --hide='temp_log.$$'devrait fonctionner. Vous pouvez / devriez également étendre cela avec des caractères génériques, selon la partie du terme temp_log.$$.
erch

Réponses:

25

Avec GNU ls(la version sur Linux non intégré et Cygwin, parfois également trouvée ailleurs), vous pouvez exclure certains fichiers lors de la liste d'un répertoire.

ls -I 'temp_log.*' -lrt

(notez la forme longue de -Iis --ignore='temp_log.*')

Avec zsh, vous pouvez laisser le shell filtrer. Passez -dà lsafin d'éviter de lister le contenu des répertoires correspondants.

setopt extended_glob          # put this in your .zshrc
ls -dltr ^temp_log.*

Avec ksh, bash ou zsh, vous pouvez utiliser la syntaxe de filtrage ksh. Dans zsh, exécutez d' setopt ksh_globabord. En bash, exécutez en shopt -s extglobpremier.

ls -dltr !(temp_log.*)
Gilles 'SO- arrête d'être méchant'
la source
S'il vous plaît, pas de guillemets simples dans l'exemple pour GNU ls: ls -I 'temp_log. *' -Lrt Ils sont nécessaires pour passer le modèle à la commande et ne pas laisser le shell le développer.
shargors
Sur Ubuntu bash v4.3.48, il devrait être -Itemp_log.*sans espace après le-I
Yan King Yin
1
@YanKingYin Non, c'est bien d'avoir un espace après le -I. Cependant, les *besoins doivent être cités d'une manière ou d'une autre. -I temp_log.*ne fonctionne pas , mais -I 'temp_log.*', -I "temp_log.*", -I temp_log.\*, etc. sont très bien.
Gilles 'SO- arrête d'être méchant'
10

Vous pouvez utiliser grepavec l'option -v.

ls -lrt | grep -v <exclude-filename-part>
andrade
la source
1
Je ne sais pas pourquoi cela a été rejeté, c'est la bonne réponse.
Tim Kennedy
5
Faire un grep sur la sortie ls n'est pas toujours correct et n'est pas recommandé. Cela a des effets secondaires. Impossible de rappeler les problèmes exacts. Note
annexe
3

Vous pouvez utiliser findpour cela:

find . \! -name 'temp_log*'

Cela affichera simplement les noms, vous pouvez ajouter -lspour créer une ls -lsortie de style avec horodatage et autorisations, ou utiliser -exec ls {} +pour passer réellement à ls avec les options que vous souhaitez pour les colonnes, le tri, etc.

J'ai écrit ceci en supposant qu'il ne s'agissait que de fichiers dans un répertoire. Si le répertoire contient d'autres répertoires, vous pouvez éviter de les répertorier récursivement

find . \! -name 'temp_log*' -maxdepth 1

Et si vous utilisez ls vous voulez passer l'option -d pour arrêter ce de liste dans les répertoires suivants :-exec ls -d {} +

Aléatoire832
la source
Vouloir probablement -maxdepth 1aussi imiter non récursif ls.
jw013
Agréable. Les utilisateurs qui ont un POSIX plus minimal findsans -maxdepth doivent regarder ici .
Wildcard
2

Je pense que vous voulez utiliser une fonction du shell, pas de ls. J'utilise bash, j'ai donc vérifié ce que vous voulez man bash. Recherchez "^ EXPANSION", (en appuyant d'abord sur '/'). Extrait:

EXPANSION

    L'expansion est effectuée sur la ligne de commande après avoir été divisée en mots. Il y a sept types d'expansion EFFECTUES: expansion des accolades , tilde extension , paramètres et variables , la substitution de commande , l' expansion arithmétique , le découpage des mots , et l' expansion du chemin .

   ︙
... <snip> ...
   ︙

Expansion du nom de chemin

    Après la séparation de mots, à moins que la -f option a été définie, bash scanne chaque mot pour les personnages *, ?et [. Si l'un de ces caractères apparaît, le mot est considéré comme un modèle et remplacé par une liste alphabétique de noms de fichiers correspondant au modèle. …

J'ai récemment commencé à exclure des fichiers en fonction de leur première lettre, avec une commande comme:

$ ls ./[^t]*

Cela correspondrait à tout ce qui ne commence pas par la lettre t. Si vous ajoutez plus de caractères entre les crochets, vous excluez également les fichiers commençant par ces lettres.

Vous cherchez un lien, et j'en ai un bon! Voir Correspondance de motifs . À partir de là, cela fonctionnerait pour votre cas:

$ ls -lrt ./!(temp_log.*)

Cela nécessite que l' extgloboption shell soit activée à l'aide de la commande shoptbuiltin ( shopt -s extglob), comme l'a déclaré Gilles .

Alex Leach
la source
-1

Fais juste

ls -ltr `grep -il patterntosearch  *`
user43658
la source
greprecherche un modèle dans un fichier, plutôt que dans le nom du fichier.
evilsoup
-2

Étant donné que les fichiers que vous ne voulez pas imprimer ont "temp_log". dans le nom de fichier, puis filtrez avec grep:

ls -lrt | grep -v "temp_log."

NOTE: L'autre message avec une réponse similaire a probablement été rejeté parce que l'utilisateur n'a pas inclus de guillemets "" autour de la chaîne que grep devrait rechercher. Sans les guillemets, cela ne fonctionne pas comme annoncé.

user185160
la source
Votre «NOTE» n'est pas strictement correcte. Il y a certains caractères qui pourraient devoir être cités, mais je ne pense pas qu'il y en ait dans cette chaîne particulière.
fume2345
jusqu'à ce qu'il y ait un utilisateur ou un groupe nommé "temp_log" (le point dans regex correspondrait à un espace ou à quoi que ce soit suivant temp_log. Ce n'est pas une bonne façon (générale) d'exclure des lsrésultats.
Jeff Schaller
uniquement avec -F, @ smokes2345; un point correspondra à n'importe quel caractère dans une expression régulière de base. Voir: unix.stackexchange.com/q/119905/117549
Jeff Schaller