Portál AbcLinuxu, 13. května 2025 21:01
Ahoj,
s BASH zacinam, tak se na me pripadne nezlobte. Chci udelat skript na porovnani adresaru se soubory, pricemz kazdy z adresaru ma jeste dalsi podadresare a vypsat ty soubory ktere jsou v kazdem z adresaru soucasne, takze to zkousim skriptem:
#!/bin/bash
counter=0;
for i in $( find ../adresar1/ -name '*.jpg' ); do
echo soubor a: $i;
ia=${i:(-12)};
echo $ia;
# sleep 1;
for j in $( find /media/disk/ -name $ia ); do
echo soubor b: $j;
ja=${j:(-12)};
echo $ja;
if [$ia == $ja]; then
echo $i;
# sleep 1;
fi
done
counter=`expr $counter + 1`;
echo $counter;
done
No a vysledek je toto:
sh find.sh
soubor a: ../podadresar/2.den/p1040855.jpg
p1040855.jpg
1
soubor a: ../podadresar
/2.den/p1040862.jpg
p1040862.jpg
2
soubor a: ../podadresar
/2.den/p1040865-z.jpg
040865-z.jpg
3
soubor a: ../podadresar
/2.den/p1040860.jpg
p1040860.jpg
4
soubor a: ../podadresar
/2.den/p1040869.jpg
p1040869.jpg
5
soubor a: ../podadresar
/2.den/p1040865.jpg
6
p1040865.jpg
........ atd.
Neni mi jasne, proc nevleze do toho druheho for
a navypise alespon to "soubor b:". Ten vnoreny cyklus uplne ignoruje. Nejspis jsem neco prehledl, ale nemuzu prijit na to kde to je.
Dik.
cd $DIR1 && find . -type f -exec ls $DIR2/{} \;
To 1) Struktura neni stejna, jedna se o to, ze mam bordel ve sbirce fotek (pomerne slusna adresarova struktura), nektere jsem z flashky nakopiroval do nekolika adresaru a nektere vubec (a to vubec nevim co udelala manzelka), takze vychazim z toho, ze se jedna o ruzny pocet adresaru s ruznyma nebo stejnyma souborama.
To 2) aha, to me nenapadlo , ale mam za to, ze tam urcite nektere soubory budou, protoze jsem je tam pred napsanim tohoto skriptu z flashky kopiroval a pak jsem zjistil, ze tam je takovy binec ..., tak nevim.
To 3) jo, chci odstranit adresarovou cast, soubory z fotaku maj stejne dlouhej nazev, tak se nic nedeje. O funkci basename jsem jaksi nevedel a parsrovat string se mi nechtelo. Ten find tam spoustim proto, ze nevim kolikrat tam ten soubor je.
find ../adresar1/ -type f -printf '%f %p\n' | sort >/tmp/lst1 find /media/disk/ -type f -printf '%f %p\n' | sort >/tmp/lst2 join lst1 lst2Vypise na kazdom riadku trojicu: nazov duplikovaneho suboru, cesta k nemu v adresari ../adresar1/, cesta v /media/disk/.
Aha, ... , taky pekne reseni. Dik moc panove, opet jsem se neco priucil ... .
Jen pro uplnost ... kdyby se nekdo dival na ten muj pseudoscript. Na jinych datech mi to funguje, takze problem bude jinde a jeste jedna drobnost - je tam syntakticka chyba v podmince ... mezi hranatyma zavorkama a podminkou ma byt mezera.
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.