Blog

Bash - wyświetlenie plików w strukturze podobnych katalogów

Wyświetlenie plików (lub wpisanie ich do pliku) w pewnej usystematyzowanej strukturze katalogów.

Katalogów jest bardzo dużo ja na potrzeby przykładu utworzyłem katalog-120 do katalog-130. Praca ręczna nigdy nie zostanie wzięta pod uwagę więc trzeba zrobić automat.

Musimy wyświetlić pliki z pewnego przedziału np katalog-120 do katalog-129. Rozwiązań zapewne jest nieskończenie wiele.

  • Pierwsze rozwiązanie wykorzystuje printf

printf "$PWD/%s\n" katalog-12[0-9]/*


/home/tk/skrypty/bash/lab/katalog-120/file2-1
/home/tk/skrypty/bash/lab/katalog-122/file2-1
/home/tk/skrypty/bash/lab/katalog-123/plik1
/home/tk/skrypty/bash/lab/katalog-125/plik5_1
/home/tk/skrypty/bash/lab/katalog-126/file6-1

Jeśli chcielibyśmy wypisać same nazwy plików to wynik wkładamy do pętli i poddajemy pod narzędzie basename.

for i in $(printf "$PWD/%s\n" katalog-12[0-9]/*);do basename $i;done

  • Drugie rozwiązanie wykorzystuje narzędzie find (moim zdaniem bardziej uniwersalna ponieważ działa również jeśli w katalogach są podkatalogi)

find ./katalog-12[0-6] -type f -exec basename {} \;

file2-1
file2-1
plik1
plik5_1
file6-1

  • Trzecie rozwiązanie wykorzystuje narzędzie ls

ls -1 katalog-12[0-7]/* |tr "\n" "\0" |xargs -0 -n 1 basename

          bądź krócej:

ls katalog-12[0-7]/* |xargs -n 1 basename

  • I kolejna wariacja.

for i in $(find . -print |grep "katalog-12[0-9]");do [[ -f $i ]] && basename $i;done

  • Bonus w postaci kodu w perl-u

#!/usr/bin/perl
use strict;
use warnings;
use File::Basename;

my @files = glob('/home/tk/skrypty/bash/lab/katalog-12[0-5]/*');
foreach (@files) {
        print basename($_), "\n";
}

<< Wróć do poprzedniej strony