GNU/Linux >> Linux Esercitazione >  >> Linux

Trovare file per i quali più varianti su quel nome file esistono insieme nella stessa directory?

Voglio elencare i file per i quali esistono, in una determinata directory, TUTTI questi file:

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

Attualmente lo sto facendo con find e sed . Funziona ma è poco elegante e lento!

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

Fondamentalmente incateno un find , due sed e un while read per ogni estensione su cui voglio filtrare.

Ci vogliono più di 35 secondi per appena 30.000 file! Come posso migliorarlo?

Esempio

Se nella directory sono presenti file chiamati AR0505.are , AR0505.tis , AR0505.wed e AR0505LM.bmp , lo script stamperebbe "AR0505".

Se uno o più di questi file mancavano, lo script non lo stampava.

Risposta accettata:

Penso che il principale collo di bottiglia sia il numero di processi generati. Ecco un semplice script che elenca e filtra la tua directory in un passaggio:

#!/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. Come verificare la presenza di file di grandi dimensioni nella console

  2. Debian – Cerca gli ultimi file modificati negli ultimi 2 minuti nella tua home directory che contengono una determinata stringa?

  3. Grep per più stringhe nei file e quindi elencare i file nell'ordine delle dimensioni?

  4. Genera Md5sum per tutti i file in una directory, quindi scrivi (nome file).md5 per ogni file contenente Md5sum di quel file?

  5. Linux:ottenere file per la data corrente in Linux?

Come cercare file dalla riga di comando di Linux

Come scoprire quale interfaccia sto usando per connettermi a Internet?

Ricerca di file che utilizzano la maggior parte dello spazio su disco

Qual è il modo più efficiente per spostare un gran numero di file che risiedono in una singola directory?

Come posso copiare un albero di directory ma non i file in Linux?

Non riesci a trovare .so nella stessa directory dell'eseguibile?