Minska blogas

Iš komandinės eilutės tamsybių

Žinutės | Blogas | Mintys | Elektronika | Technologijos | Politika | Oro stebėjimas | Filmai ir serialai | Knygos | Apie

Bash triukai: 1 - pakeisti simbolius failų pavadinimuose

Jau seniai galvojau pradėti aprašinėti įvairius komandinės eilutės triukus, kuriuos tenka panaudoti. Jau seniai reikėjo taip daryti, nes vis užmirštu kokį gudrų komandų derinį ir vis tenka ieškoti iš naujo. Dabar pasidėsiu čia savo svetainėje ir žinosiu, kur galiu greitai susirasti, jei kada vėl prireiks, o taip pat pasidalinsiu su jumis visais. Galbūt susipažinsite su tuo, kas daro komandinę eilutę tokia galinga.

Pirmasis atvejis šitoks: mano muzikos grotuvas spyriojasi, kad jam nepatinka failų pavadinimuose esantys dvitaškiai (:), klaustukai (?) ir dar noriu padaryti, kad failų pavadinimuose nebūtų tarpų ( ).

O sprendimas toks:

                for f in *.flac; do mv "$f" "$(echo $f | sed 's/[:? ]//g')"; done
            

Iš pradžių reikia nukeliauti į direktoriją, kur yra norimi pakeisti failai. Ši komanda kiekvienam failui, į kurį kreipsimės vardu f, iš visų failų, kurie baigiasi .flac (galima pakeisti į bet kokį kriterijų, apie tai kiek vėliau), daro štai ką: komandai mv prideda pirmą argumentą, kuris yra originalus failo pavadinimas ($f), ir antrą argumentą, kuris yra originalus failo pavadinimas, perleistas per dar vieną komandą - sed, kuri ir atlieka simbolių pakeitimą. Simbolių pakeitimas vyksta taip: komanda echo išspausdina originalųjį failo pavadinimą, tačiau pavadinimas ekrane neatsiranda, nes naudojamas vamzdis "|" (angl. pipe), kuris tą pavadinimą iš komandos echo išėjimo nukreipia į komandos sed įėjimą. Komanda sed naudoja tokius nurodymus: 's/[simboliai]//g'. s nurodo šioje frazėje naudojamą skirtuką. Šiuo atveju tai yra pasvirasis brūkšnelis "/". Laužtiniuose skiliaustuose "[" ir "]" įrašomi simboliai, kuriuos norima pašalinti arba pakeisti. Po dar vieno skirtuko yra simbolis į kurį norima pakeisti nepageidaujamus simbolius. Mano ateju tai yra nieko, nes aš norėjau ištrinti visus ":", "?" ir tarpus. Jei ten įrašyti tarpą " ", tai vietoj visų dvitaškių ir klaustukų atsirastų tarpai. Jei ten įrašyti brūkšnelį, atsiras brūkšniai ir taip toliau. Galiausiai paskutinis skirtukas ir už jo esanti raidė g, kuri reiškia, kad norima pakeisti ne tik pirmą pasitaikiusį dvitaškį, klaustuką ar tarpą, bet visus. Kaip sakant, norima vykdyti veiksmą globaliai.

Kaip minėjau, vietoj *.flac komandoje galima įrašyti bet kokį kitą failo apbibūdinimą. *.flac reiškia visi failai, kurie baigiasi ".flac". Jei pakeisti į *.txt, tai būtų pakeisti visi failai, kurių pavadinimų gale yra ".txt". Bet tai nebūtinai turi būti failo galas. Jei įrašyti "FAIL*", tai būtų pakeisti visų failų pavadinimai, prasidedantys simboliais "FAIL". Galbūt apie visokiausius būdus nurodyti failus parašysiu kada nors vėliau.

Pabaigai dar vienas pavyzdys. Tarkime noriu pakeisti visus failų pavadinimus, kuriuose yra ę arba ė raidės. Jas noriu pakeisti į paprastą e. Ir nesvarbu, kaip prasideda ar baigiasi failų pavadinimai, noriu tai atlikti jiems visiems. Tada naudočiau tokią komandą:

                for f in *; do mv "$f" "$(echo $f | sed 's/[ęė]/e/g')"; done
            

Išbandžiau - pavyko. Tikiuosi pravers ir dar kam nors.


Irašo komentarai

Komentarus siųskite man elektroniniu paštu, adresu: mindaugas per minska taškas lt.

Laiške nurodykite įrašo pavadinimą ir ar norite, kad jūsų komentaras būtų paviešintas.