Kirjoittaja Aihe: Tiedostojen valikoiva poisto sekä kuvatyyppien kvalifikaatio  (Luettu 3610 kertaa)

tmv

  • Käyttäjä
  • Viestejä: 81
    • Profiili
1) Miten saadaan poistettua tietyn tyyppisiä tiedostoja useasta eri hakemistosta?

Esimerkiksi on seuraavanlaiset hakemistot (alla). Hakemistot sisältävät monia eri tiedostyyppiä:( *.png *.jpg *.mpg *.txt *.gz) Tarkoitus on poistaa kaikki muut paitsi *.png *.jpg *.mpg tiedostot. Manuaalinen poisto on liian hidasta, koska hakemistoja on useita.

Tarvitaanko tähän bash-skirptiä vai onnistuisiko myös Midnight Commanderilla?

Koodia: [Valitse]
esimerkki hakemistot:
~/sandbox/a
~/sandbox/b
~/sandbox/c

2) Kuvatiedostoissa on thumbnail-kuvia ja siitä isompia kuvia. Miten saataisiin jaoteltua thumbnail-kuvat hakemistoon a ja isommat kuvat hakemistoon b?

Tiedostoja on paljon ja manuaalinen läpikäyminen on tässäkin tapauksessa mahdotonta. Löytyisiköhän valmista ohjelmaa vai onnistuisko tämäkin  bash-skriptillä?
« Viimeksi muokattu: 13.12.15 - klo:21.57 kirjoittanut noquaa »

AimoE

  • Käyttäjä
  • Viestejä: 2782
    • Profiili
1) Miten saadaan poistettua tietyn tyyppisiä tiedostoja useasta eri hakemistosta?

Esimerkiksi on seuraavanlaiset hakemistot (alla). Hakemistot sisältävät monia eri tiedostyyppiä:( *.png *.jpg *.mpg *.txt *.gz) Tarkoitus on poistaa kaikki muut paitsi *.png *.jpg *.mpg tiedostot. Manuaalinen poisto on liian hidasta, koska hakemistoja on useita.

Tarvitaanko tähän bash-skirptiä vai onnistuisiko myös Midnight Commanderilla?

Koodia: [Valitse]
esimerkki hakemistot:
~/sandbox/a
~/sandbox/b
~/sandbox/c

Tähän ei tarvita scriptiä, vaan komento riittää (paitsi jos haluat toistaa operaation usein, jolloin tietenkin teet siitä scriptin).

Ensin katson että saat kaikki poistettavat tiedostot kiinni find-komennolla:

Koodia: [Valitse]
find ~/sandbox -name '*.txt' -o -name '*.gz'
ja sitten piiputat luettelon komennolle joka tuhoaa tiedostot:

Koodia: [Valitse]
find ~/sandbox -name '*.txt' -o -name '*.gz' | xargs rm -i
Tuo rm -i kysyy luvan joka tiedoston tuhoamiseen erikseen. Jos et tarvitse sitä, jätä -i pois.

Kakkoskysymykseen löytynee myskin vastaus find-komennon manuaalista.

tmv

  • Käyttäjä
  • Viestejä: 81
    • Profiili
Kiitos taas opin jotain uutta.

tuo -i vipu rm:ssä ei tosin toiminut. Heittää ruudun täydeltä tämän tyylistä tulostetta: rm: remove regular file ‘./5/recup_dir.3/f21951200.txt’? mutta ei kuitenkaan kysy eikä poista.

########

Tällä tiedolla, tuon kakkoskysymyksen filtteröinti saattaa onnistua pipettämällä identify(1) findiin. Mutta palaan tähän vielä. Ei ole imagemagick asennettuna edes.

http://linux.die.net/man/1/identify man sivut identify.
http://www.ling.helsinki.fi/kit/2004s/ctl130_syrjanen/xargs.xhtml xargin perusinfo.
« Viimeksi muokattu: 13.12.15 - klo:21.57 kirjoittanut noquaa »

AimoE

  • Käyttäjä
  • Viestejä: 2782
    • Profiili
tuo -i vipu rm:ssä ei tosin toiminut. Heittää ruudun täydeltä tämän tyylistä tulostetta: rm: remove regular file ‘./5/recup_dir.3/f21951200.txt’? mutta ei kuitenkaan kysy eikä poista.

Miten niin ei kysy - tuohan juuri one se kysymys. Alussa on remove ja lopussa kyssäri, siis ihan selvä kysymys. Siihen vastaan joko n (=ei poisteta) tai y (=poistetaan), ja sama kyssäri tulee joka tiedostolle. En edes keksi miten asiaan vaikuttaisi jos rm on alias, kun optio -i kuitenkin annetaan sen perään.

Ja sieltä find-komennosta löytyy kyllä optiot joilla löytää tietyn kokoiset tiedostot.

tmv

  • Käyttäjä
  • Viestejä: 81
    • Profiili
tuo -i vipu rm:ssä ei tosin toiminut. Heittää ruudun täydeltä tämän tyylistä tulostetta: rm: remove regular file ‘./5/recup_dir.3/f21951200.txt’? mutta ei kuitenkaan kysy eikä poista.

Miten niin ei kysy - tuohan juuri one se kysymys. Alussa on remove ja lopussa kyssäri, siis ihan selvä kysymys. Siihen vastaan joko n (=ei poisteta) tai y (=poistetaan), ja sama kyssäri tulee joka tiedostolle. En edes keksi miten asiaan vaikuttaisi jos rm on alias, kun optio -i kuitenkin annetaan sen perään.

Ja sieltä find-komennosta löytyy kyllä optiot joilla löytää tietyn kokoiset tiedostot.

Niin siis komennot tuovat ruudulle tulosteen, missä kyllä kysytään, mutta ei varsinaista Y/N valintamahdollisuutta.
« Viimeksi muokattu: 13.12.15 - klo:21.57 kirjoittanut noquaa »

nm

  • Käyttäjä
  • Viestejä: 16428
    • Profiili
Joo, tuossa xargs korvaa näppäimistösyötteen ja vastaa rm -i:n kysymykseen seuraavan poistettavan tiedoston nimellä jne. kunnes tiedostot loppuvat.

Kyseinen operaatio onnistuu paremmin findin execillä:

Koodia: [Valitse]
find ~/sandbox -name '*.txt' -o -name '*.gz' -exec rm -i {} \;

AimoE

  • Käyttäjä
  • Viestejä: 2782
    • Profiili
Äh, joo, en vaan sattuneesta syystä alkanut sitä loppuun asti testaamaan. Mutta joka tapauksessa yhdellä komennolla se onnistuu, tai siis kahdella kun rm lasketaan mukaan. Mun yritys käytti kolmatta ihan suotta. Find-komento on yksi niistä unix-komennoista jotka muistuttaa sveitsiläistä linkkuveistä.

tmv

  • Käyttäjä
  • Viestejä: 81
    • Profiili
2) Kuvatiedostoissa on thumbnail-kuvia ja siitä isompia kuvia. Miten saataisiin jaoteltua thumbnail-kuvat hakemistoon a ja isommat kuvat hakemistoon b?

Tiedostoja on paljon ja manuaalinen läpikäyminen on tässäkin tapauksessa mahdotonta. Löytyisiköhän valmista ohjelmaa vai onnistuisko tämäkin  bash-skriptillä?

Koodia: [Valitse]
#!/bin/bash

dirs=($(find . -type d))
for dir in "${dirs[@]}"
do
cd "~/path/$dir"
    for image in *.jpg *.JPG *.gif *.GIF *.png *.PNG
    do
    res=$(identify -format %wx%h\\n "$image")
    mkdir -p $res
    mv "$image" $res
    done
done

Vaikuttaisi toimivalta. Siirtää kuvat hakemistoihin mitkä muodustuvat resoluution mukaisesti.
Mitenköhän komentorivitä olisi vastaavanlainen onnistunut.

Mutta vaikka toi tuottaakin halutun tuloksen, luulen että for loopit on jotenkin väärin. Ihmettelen että silti toimii.
« Viimeksi muokattu: 13.12.15 - klo:21.57 kirjoittanut noquaa »