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


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.*)

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'


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 {} +


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 .


-1

Fais juste

ls -ltr `grep -il patterntosearch  *`

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é.


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
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.