GNU/Linux >> Znalost Linux >  >> Linux

Najít soubory, pro které existuje více variant tohoto názvu souboru společně ve stejném adresáři?

Chci vypsat soubory, pro které existují v daném adresáři VŠECHNY tyto soubory:

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

Momentálně to dělám pomocí find a sed . Funguje to, ale je to nevkusné a pomalé!

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

V podstatě řetězím find , dva sed a while read pro každé rozšíření, podle kterého chci filtrovat.

Sotva 30 000 souborů trvá> 35 s! Jak to mohu zlepšit?

Příklad

Pokud jsou v adresáři soubory s názvem AR0505.are , AR0505.tis , AR0505.wed a AR0505LM.bmp , pak skript vypíše „AR0505“.

Pokud jeden nebo více těchto souborů chybí, skript jej nevytiskne.

Přijatá odpověď:

Myslím, že hlavním úzkým hrdlem je počet procesů, které spustíte. Zde je jednoduchý skript, který vypíše a filtruje váš adresář v jednom průchodu:

#!/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. Jaký je nejlepší způsob, jak spočítat počet souborů v adresáři?

  2. Grep pro více řetězců v souborech a pak seznam souborů v pořadí velikosti?

  3. Vygenerovat Md5sum pro všechny soubory v adresáři a pak napsat (filename).md5 pro každý soubor obsahující Md5sum daného souboru?

  1. Linux:Odeberte přípony souborů pro více souborů

  2. find:cesty musí předcházet výrazu:Jak určím rekurzivní vyhledávání, které také najde soubory v aktuálním adresáři?

  3. Odstranění části názvu souboru pro více souborů v systému Linux

  1. Najděte soubory, které byly změněny za posledních 24 hodin

  2. Najděte soubory existující v jednom adresáři, ale ne ve druhém

  3. Nemůžete najít .so ve stejném adresáři jako spustitelný soubor?