Baziniai klausimai dėl Bash skriptų naudojimo

S
  • 11 Lie '13

Nieko apie šiuos dalykus nenutuokiu, bet bandau vieną kitą su kompiuteriu atliekamą funkciją automatizuotis. Dalį išsigooglinu, dalies nepavyksta.

Pirmas klausimas:
Kaip nurodyti, kad veiksmai būtų atliekami su direktorijoje esančiais konkrečiais failų tipais? Šiuo atveju reikia perkopijuoti MO ir PO failus, bet neliesti kitų formatų.

cp /home/mantas/Documents/www/wp-content/languages/*.po /home/mantas/Documents/www/wp-content/WP-3.6/wp-content/languages;

Galiu dėti wildcardus, galiu rašyti dvi atskiras eilutes, bet norėtųsi mokėti nurodyti konkrečius formatus. Bandžiau kišti (mo|po), bet, matyt, dar kažko čia daugiau trūksta.

Antras klausimas:
Masinis failų redagavimas
Turiu dabar tokį susikūręs kodą:

cd /home/mantas/Desktop;
for file in *.jpg; do convert $file -resize 600 -quality 80 r-$file;
jpegoptim --strip-all /home/mantas/Desktop/r-*.jpg; done

Čia imagemagick sumažina paveikslėlius iki 600 pločio, truputį kokybę numuša ir išsaugo pavadinimu r-failas, o jpegoptim dar tą failą truputį paoptimizuoja dėl kelių kilobaitų.

Kaip padaryti, kad jis išsaugotų ne kitu pavadinimu, o sukurtų poaplankį ir saugotų ten perdarytus paveikslėlius su originaliais pavadinimais?

Aišku, čia gal galima aplink apeiti pakopijuojant originalius failus į poaplankį ir redaguotus surašyti originaliam aplanke ant viršaus, jei jau kitaip nepavyks.

T
Techtronic
Mindaugas N.
  • 11 Lie '13

Turbut rasi ir paprastesniu budu pasiekti tiksla, bet patarciau paskaityti apie find (nes tikrai pravers).

Kaip tai veikia:

find . -name "*.jpg" -printf "convert '%h/%f' '%h/lib/%f'\n"

Gali per pipe execute, arba naudoti find -exec. Arba dar geriau, gali pagal date, stai dar vienas example:

find -mount -maxdepth 1 -printf "%.5m %10M %#9u:%-9g %#5U:%-5G %TF_%TR %CF_%CR %AF_%AR %#15s [%Y] %p\n"

http://www.gnu.org/software/findutils/m ... /find.html

G
  • 11 Lie '13

*Pirmam klausimui siūlyčiau pabandyti tokius variantus:

cp -t kur/kopijuoju/ *.mo *.po
cp {*.mo,*.po} kur/kopijuoju/
cp *{.mo,.po} kur/kopijuoju/

Atkreipk dėmesį, kad negali būti tarpų po kablelio tarp laužtiniuose skliaustuose aprašomų dedamųjų.

Techtronic gerai pastebėjo, find įrankio vėliau tau prireiks vis dažniau. Daugeliu atveju jis kur kas galingesnis nei paprastas “shell expansion”.

  • Antrajam siūlyčiau perrašyti scenarijų taip ar panašiai:
    ```
    #!/bin/bash

_darbinis_aplankas="$1"
_rezultatu_aplankas='Kur/Guli/Rezultatai' # Pasivadini rezultatu aplanka

Patikrini, ar teisingai nurodei darbini aplanka, ir ar jis nera tuscias

if [ -d "$_darbinis_aplankas" -a "$(ls -A "$_darbinis_aplankas")" ]; then

# Jei teisingai - tada susikuri rezultatu aplanka
cd "$_darbinis_aplankas"
mkdir -p "$_rezultatu_aplankas"
# Sutvarkai failus
for failas in *.jpg; do 
    convert "$failas" -resize 600 -quality 80 "$_rezultatu_aplankas/$failas";
    jpegoptim --strip-all "$_rezultatu_aplankas/$failas"
done

else ## Jei neteisingai - baigi darba
echo 'Kazkas negerai!'
exit 1
fi

Šiaip ir pats viską buvai pasirašęs gerai. Aš pridėjau porą kintamųjų (kad būtų legviau kontroliuoti: iš kur imami failai, kur talpinami).
Taip pat griozdišką patikrinimą dėl aplanko tinkamumo scenarijuj, kurį be abejo gali išmesti.

***Kaip naudotis***?
Jei pavadinsi scenarijų *settle.sh*, tada paleisk jį taip:

./settle.sh /home/settle/pripaveikslavo
```
Žinoma pakeisk /home/settle/pripaveikslavo į katalogą, kuriame talpini savo jpg paveikslėlius.

S
  • 13 Lie '13

O, dėkui. Išbandžiau abu, viskas puikiausiai veikia, kaip ir norėjau.