GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Dateien finden, für die mehrere Variationen dieses Dateinamens zusammen im selben Verzeichnis vorhanden sind?

Ich möchte die Dateien auflisten, für die es in einem bestimmten Verzeichnis ALLE dieser Dateien gibt:

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

Ich mache das derzeit mit find und sed . Es funktioniert, aber es ist unelegant und langsam!

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

Grundsätzlich verkette ich einen find , zwei sed und ein while read für jede Erweiterung, nach der ich filtern möchte.

Es dauert>35 Sekunden für knapp 30.000 Dateien! Wie kann ich es verbessern?

Beispiel

Wenn sich im Verzeichnis Dateien namens AR0505.are befinden , AR0505.tis , AR0505.wed und AR0505LM.bmp , dann würde das Skript „AR0505“ ausgeben.

Wenn eine oder mehrere dieser Dateien fehlten, würde das Skript sie nicht drucken.

Akzeptierte Antwort:

Ich denke, der größte Engpass ist die Anzahl der Prozesse, die Sie erstellen. Hier ist ein einfaches Skript, das Ihr Verzeichnis in einem Durchgang auflistet und filtert:

#!/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. So suchen Sie in der Konsole nach großen Dateien

  2. Was ist der beste Weg, um die Anzahl der Dateien in einem Verzeichnis zu zählen?

  3. Debian – In den letzten 2 Minuten nach zuletzt geänderten Dateien in Ihrem Home-Verzeichnis suchen, die eine bestimmte Zeichenfolge enthalten?

  4. Grep für mehrere Zeichenfolgen in Dateien und dann die Dateien in der Reihenfolge ihrer Größe auflisten?

  5. Md5sum für alle Dateien in einem Verzeichnis generieren und dann (Dateiname).md5 für jede Datei schreiben, die die Md5sum dieser Datei enthält?

So suchen Sie nach Dateien über die Linux-Befehlszeile

Linux:Dateierweiterungen für mehrere Dateien entfernen

find:Pfade müssen dem Ausdruck vorangestellt werden:Wie lege ich eine rekursive Suche fest, die auch Dateien im aktuellen Verzeichnis findet?

Entfernen eines Teils eines Dateinamens für mehrere Dateien unter Linux

Finden Sie die Dateien, die in den letzten 24 Stunden geändert wurden

Finden Sie die Dateien, die in einem Verzeichnis vorhanden sind, aber nicht im anderen