Portál AbcLinuxu, 26. dubna 2024 16:44


Dotaz: Jak v Bashi rozparsovat názvy souborů na adresáře

6.4.2018 21:42 Oleg
Jak v Bashi rozparsovat názvy souborů na adresáře
Přečteno: 303×
Odpovědět | Admin
Ahoj, potřeboval bych nakopnout, jak z názvů jako mat_ZMA_integraly_ukol1.doc udělat stromovou adresářovou strukturu (prostě jakoby _ nahradit za /) v níž pak bude uložen soubor ukol1.doc. Takhle pojmenovaných mám asi tisíc souborů, které potřebuji roztřídit do správných adresářů (pokud neexistuje tak vytvořit) a název souboru prostě zkrátit. Nechce se mi vymýšlet nic složitého, tak asi bude nejlepší, kdyby to bylo v Bashi.

Řešení dotazu:


Nástroje: Začni sledovat (0) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

Řešení 1× (jose17)
7.4.2018 03:01 pc2005 | skóre: 38 | blog: GardenOfEdenConfiguration | liberec
Rozbalit Rozbalit vše Re: Jak v Bashi rozparsovat názvy souborů na adresáře
Odpovědět | | Sbalit | Link | Blokovat | Admin
Získat string aktuálního jména souboru. To asi pomocí cyklu s find. Po evaluaci cílového adresáře a jména udělat něco jako
cp "$ORIGNAME" cil
Řešení je několik. Záleží na tom co všechno za stringy je ve jméně souboru a zda k tomu chceš i něco přidávat.

1) Můžeš udělat pattern matching
${parameter#word}
matchovat na "_" a vybírat vždy head (první proměnnou) a tail (zbytek) a z headu dělat mkdir. Až bude tail prázdnej, tak bude v head název souboru.

2) Nastavit IFS na "_" a na string a rozparsovat jednotlivé substringy přes
for DIR in $ORIGNAME
Je dost možný, že si budeš muset zapamatovat starej IFS a přepínat ho. Taky si musíš vymyslet detekci posledního substringu (jména souboru).

3) Turbo řešení by bylo vzít string jména souboru, všechny podtržítka nahradit "/"
${parameter/pattern/string}
a pak provést
dirname "a/b/c/d/e/file.xxx"
na získání cesty a udělat mkdir -p na vytvoření. Ale tam se může rozbít hodně věcí.
Intel meltdown a = arr[x[0]&1]; karma | 帮帮我,我被锁在中国房
7.4.2018 08:19 Oleg
Rozbalit Rozbalit vše Re: Jak v Bashi rozparsovat názvy souborů na adresáře
Díky moc! To s tím IFS je chytrý. To by asi šlo i v AWK, který je na takové dělení podle FS dělanej, pak bych volal system() a vytvářel a přesouval nebo rovnou kopíroval cp --parents.

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.