GNU/Linux >> Tutoriels Linux >  >> Linux

Trouver des fichiers pour lesquels plusieurs variantes de ce nom de fichier existent ensemble dans le même répertoire ?

Je souhaite lister les fichiers pour lesquels il existe, dans un répertoire donné, TOUS ces fichiers :

  • <filename>.wed
  • <filename>.tis
  • <filename>.are
  • <filename>LM.bmp

Je le fais actuellement avec find et sed . Ça marche mais c'est inélégant et lent !

find . -iname "*.wed" -exec echo {} \; | sed s/.wed$// $1 | sed s/..// $1 | while read in; do find . -name "$in.are"; done | sed s/.are$// $1 | sed s/..// $1 | while read in; do find . -name "$in.tis"; done | sed s/.tis$// $1 | sed s/..// $1 | while read in; do find . -name "$in*.bmp"; done

En gros j'enchaine un find , deux sed et un while read pour chaque extension sur laquelle je souhaite filtrer.

Cela prend plus de 35 s pour à peine 30 000 fichiers ! Comment puis-je l'améliorer ?

Exemple

Si dans le répertoire il y a des fichiers nommés AR0505.are , AR0505.tis , AR0505.wed et AR0505LM.bmp , le script affichera "AR0505".

Si un ou plusieurs de ces fichiers manquaient, le script ne l'imprimerait pas.

Réponse acceptée :

Je pense que le principal goulot d'étranglement est le nombre de processus que vous générez. Voici un script simple qui liste et filtre votre répertoire en un seul passage :

#!/usr/bin/perl

use strict;
use warnings;

my %files;
my $dir;
my @extensions = ("\.tis","\.are","LM\.bmp","\.wed");

opendir($dir, ".") || die "Error opening dir\n";
while (my $file = readdir($dir)) {
    foreach my $ext (@extensions) {
        if ($file =~ /^(.*)$ext$/sm) {
            $files{$1} += 1;
        }
    }
}
closedir($dir);

foreach my $file (keys %files) {
    if ($files{$file} == scalar(@extensions)) {
        print "$file\n";
    }
}

Linux
  1. Comment vérifier les fichiers volumineux dans la console

  2. Quelle est la meilleure façon de compter le nombre de fichiers dans un répertoire ?

  3. Générer une somme Md5 pour tous les fichiers d'un répertoire, puis écrire (nom de fichier).md5 pour chaque fichier contenant la somme Md5 de ce fichier ?

  4. find :les chemins doivent précéder l'expression :comment spécifier une recherche récursive qui trouve également des fichiers dans le répertoire courant ?

  5. Suppression d'une partie d'un nom de fichier pour plusieurs fichiers sous Linux

Comment rechercher des fichiers à partir de la ligne de commande Linux

Debian - Recherche des fichiers modifiés en dernier lieu au cours des 2 dernières minutes dans votre répertoire personnel qui contiennent une certaine chaîne ?

Grep pour plusieurs chaînes dans des fichiers, puis répertorier les fichiers dans l'ordre de taille ?

Linux - Obtenir des fichiers pour la date actuelle sous Linux ?

Linux :supprimer les extensions de fichiers pour plusieurs fichiers

Trouver les fichiers qui ont été modifiés au cours des dernières 24 heures