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";
}