GNU/Linux >> Tutoriales Linux >  >> Linux

¿Encontrar archivos para los que existen múltiples variaciones en ese nombre de archivo juntos en el mismo directorio?

Quiero enumerar los archivos para los que existen, en un directorio dado, TODOS estos archivos:

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

Actualmente lo estoy haciendo con find y sed . ¡Funciona pero es poco elegante y 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

Básicamente encadeno un find , dos sed y un while read para cada extensión por la que quiero filtrar.

¡Toma>35s para archivos de apenas 30K! ¿Cómo puedo mejorarlo?

Ejemplo

Si en el directorio hay archivos llamados AR0505.are , AR0505.tis , AR0505.wed y AR0505LM.bmp , entonces el script imprimiría "AR0505".

Si falta uno o más de estos archivos, el script no los imprimirá.

Respuesta aceptada:

Creo que el principal cuello de botella es la cantidad de procesos que genera. Aquí hay una secuencia de comandos simple que enumera y filtra su directorio en una sola pasada:

#!/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. Cómo buscar archivos grandes en la consola

  2. ¿Cuál es la mejor manera de contar el número de archivos en un directorio?

  3. Debian:busque los últimos archivos modificados en los últimos 2 minutos en su directorio de inicio que contienen una determinada cadena.

  4. ¿Grep para cadenas múltiples en archivos y luego listar los archivos en orden de tamaño?

  5. ¿Generar Md5sum para todos los archivos en un directorio y luego escribir (nombre de archivo).md5 para cada archivo que contenga el Md5sum de ese archivo?

Cómo buscar archivos desde la línea de comandos de Linux

find:las rutas deben preceder a la expresión:¿Cómo especifico una búsqueda recursiva que también encuentre archivos en el directorio actual?

Eliminar parte de un nombre de archivo para varios archivos en Linux

¿Cuál es la forma más eficiente de mover una gran cantidad de archivos que residen en un solo directorio?

¿Cómo copio un árbol de directorios pero no los archivos en Linux?

¿No puede encontrar .so en el mismo directorio que el ejecutable?