Ubuntu Suomen keskustelualueet
Muut alueet => Muut käyttöjärjestelmät ja Linux-jakelut => Aiheen aloitti: JarTak - 03.11.12 - klo:03.06
-
Tuli ostettua uusi kovalevy ja Gpartedilla leikkiessäni tuli Grub rescue teksti vanhaan kovalevyyn. Pari kertaa Boot repair kokeilua ja koko kovalevy oli unallocated tilassa. Testdisk ei pelastanut, joten otin Photorecillä talteen tiedostot kovalevyltä ja imagen koko kovalevystä. Noin miljoona tiedostoa sieltä putkahti, jotka Photorec jakoi yhteensä 2057 eri kansioon.joten niiden selaaminen on vähiintäänkin hiiiidasta ja työlästä. Krename nimisellä ohjelmalla olen kokeillut yhdistää sadan kansion tiedostoja yhden kansion alle(kansiot 1-100, kansiot 101-200 jne..). On kyllä niin hidasta hommaa, että ei millään jaksais manuaalisesti kaikkia järkätä kun nuo sadan kansion yhdistetyt tiedostot avautuu ja toimii järkyttävän hitaasti.
Varmuuskopiot olen ottanut noin puolivuotta sitten, joten kovin paljon arvokasta tavaraa ei ehtinyt mennä hukkaan
/home/omanimi/Palautetut kansion alla on tällä hetkellä kansiot recup_dir.1 - recup_dir.2057 eli yhteensä 2057 kansiota joista jokainen sisältää palautettuja tiedoston pätkiä. Nuo tiedoston pätkät ovat suurimmaksi osaksi jotain hyödyttömiä muutaman kilotavun jämä tiedostoja joiden perkaaminen vie....no ainakin aikaa.
TEHTÄVÄ 1:
Keksi tai taio päätteeseen jokin scripti jolla voisin poistaa kaikki alle 50 kilotavun tiedostot noista 2057:stä kansiosta.
TEHTÄVÄ 2: Keksi tai taio päätteeseen jokin scripti jolla nuo 2057 kansion kaikki tiedostot saa yhdistettyä yhden kansion alle, jonka nimi olkoon vaikka Palautetut yli 50kt
Luonnollisesti kokeilen ehdottamianne scriptejä pienemmällä eräajolla, sillä sen verran ymmärrän päätettä, että osaan muokata scriptien sisällä olevien kansioiden paikkoja.
Katsotaan millaisia velhoja täältä löytyy;)
-
----
TEHTÄVÄ 1:
Keksi tai taio päätteeseen jokin scripti jolla voisin poistaa kaikki alle 50 kilotavun tiedostot noista 2057:stä kansiosta.
TEHTÄVÄ 2: Keksi tai taio päätteeseen jokin scripti jolla nuo 2057 kansion kaikki tiedostot saa yhdistettyä yhden kansion alle, jonka nimi olkoon vaikka Palautetut yli 50kt
Luonnollisesti kokeilen ehdottamianne scriptejä pienemmällä eräajolla, sillä sen verran ymmärrän päätettä, että osaan muokata scriptien sisällä olevien kansioiden paikkoja.
Katsotaan millaisia velhoja täältä löytyy;)
Velhoja odotellessasi kokeile vaikka noita:
Vaihe 1.
find aloitushakemisto -type f -size -50k|xargs ls -l
ja jos näyttää sopivalta niin vaida tuon 'ls -l' tilalle mieleisesi loitsu
Vaihe 2.
find aloitushakemisto -type f|awk '{print "cp -p "$1" kohdehakemisto/."}' > kokoa
ja katso mitä sait tiedostoon kokoa
-
Jekun idea on toimiva, mutta laittaisin varoilta pari lisävipusta (siis siltä varalta että nimissä on välilyöntejä).
Hokkus pokkus 1:
find aloitushakemisto -type f -size -50k -print0 |xargs -0 rm
tai sitten pelkkä
find aloitushakemisto -type f -size -50k -delete
2.
find aloitushakemisto -type f -size -50k -print0 |xargs -0 -i mv -n '{}' kohdehakemisto
tai
find aloitushakemisto -type f -size -50k -exec mv -n '{}' kohdehakemisto \;
Siirtää kaikki löydetyt kohdehakemistoon. Tai ei välttämättä, koska laitoin tuohon mv komentoon -n vipusen, jolloin kohdehakemistossa olevia teidostoja ei korvata (siltä varalta että on monta saman nimistä, mutta erilaista tiedostoa).
Oikeastaan tuota poistoloitsuahan (1) ei siis tarvitse, jos käyttää mv komentoa kakkosloitsussa.
Lisävahinkojen välttämiseksi käyttäisin silti graafista hakua (nautilus) jolloin voi helpommin seuloa löydetyt.
-
jarmo@jarmo-ThinkPad-R61 ~ $ find /home/jarmo/testi 1 -type f -size -50k|xargs ls -l
find: "/home/jarmo/testi": Tiedostoa tai hakemistoa ei ole
find: "1": Tiedostoa tai hakemistoa ei ole
yhteensä 156294772
Kaikilla muillakin loitsuilla tulee ilmoitusta että tiedostoa tai hakemistoa ei ole vaikka /home/jarmo/testi 1 hakemisto kyllä on olemassa. Ehdotuksia??
Lisävahinkojen välttämiseksi käyttäisin silti graafista hakua (nautilus) jolloin voi helpommin seuloa löydetyt.
Käytössä on Nautiluksen forkkaus Caja tässä Mintissä, mutta ongelma on siinä että kansioiden alla on niin paljon tiedostoja että kone hidastuu huomattavasti ja 2057 kansion perkaaminen tiedostoineen vie niin paljon aikaa, että helpompi laittaa vaikka yöksi kone tekemään taikojaan.
Kiitokset tähän astisista ja jatketaanpa harjoituksia.
-
Laita aina lainausmerkkien sisään polku niin ei välilyönti nimessä häiritse eli "/home/jarmo/testi 1 ". Kuten huomaat virheviestistä niin muuten "find" luulee että sinulla on erikseen jokin toinen tiedosto jonka nimi on "1".
-
jarmo@jarmo-ThinkPad-R61 ~ $ find "/home/jarmo/testi 1" -type f -size -50k -print0 |xargs -0 rm
rm: operandi puuttuu
Lisätietoja komennolla ”rm --help”.
jarmo@jarmo-ThinkPad-R61 ~ $
jarmo@jarmo-ThinkPad-R61 ~ $ find "/home/jarmo/testi 1" -type f|awk '{print "cp -p "$1" "/home/jarmo/testi 3"/."}' > -50k
awk: (FILENAME=- FNR=1) fatal: division by zero attempted
jarmo@jarmo-ThinkPad-R61 ~ $
jarmo@jarmo-ThinkPad-R61 ~ $ find "/home/jarmo/testi 1" -type f -size -50k -print0 |xargs -0 rm
rm: operandi puuttuu
Lisätietoja komennolla ”rm --help”.
jarmo@jarmo-ThinkPad-R61 ~ $ find "/home/jarmo/testi 1" -type f -size -50k -delete
jarmo@jarmo-ThinkPad-R61 ~ $
jarmo@jarmo-ThinkPad-R61 ~ $ find "/home/jarmo/testi "1 -type f|awk '{print "cp -p "$1" "/home/jarmo/testi "3/."}' > -50k
awk: (FILENAME=- FNR=1) fatal: division by zero attempted
jarmo@jarmo-ThinkPad-R61 ~ $ find "/home/jarmo/testi 1" -type f -size -50k -exec mv -n '{}' "/home/jarmo/testi 3" \;
jarmo@jarmo-ThinkPad-R61 ~ $
Tuon testi 1 kansion alla on siis kymmenen muuta kansiota joissa kaikissa palautettuja tiedoston pätkiä. Kyllä tää tästä -> Lisää loitsuja kehiin.
-
Hmm... rm herjaa että operandi puuttuu. En oikein keksi tuohon muuta syytä kuin että tiedostoja ei löytynyt. Ehkä ne on jo poistettu. ???
Pelkkä komento
find "/home/jarmo/testi 1" -type f -size -50k
listaa hakuehtoa vastaavat tiedostot.
-
jarmo@jarmo-ThinkPad-R61 ~ $ find "/home/jarmo/testi 1" -type f -size -50k -print0 |xargs -0 rm
rm: operandi puuttuu
Lisätietoja komennolla ”rm --help”.
Tuolta "rm" komennosta puuttuu muodollinen parametri mikä on helppoa sinne lisätä mutta tuo on yksinkertaisempi kun antaa "find": in tehdä yksinään koko asian (ilman putkitusta xargs/rm) kun ajatuksena oli poistaa ne tiedostot.
jarmo@jarmo-ThinkPad-R61 ~ $ find "/home/jarmo/testi 1" -type f -size -50k -delete
jarmo@jarmo-ThinkPad-R61 ~ $
Tuo on oletettavasti tehnyt tehtävänsä.
-
----
Tuolta "rm" komennosta puuttuu muodollinen parametri mikä on helppoa sinne lisätä mutta tuo on yksinkertaisempi kun antaa "find": in tehdä yksinään koko asian (ilman putkitusta xargs/rm) kun ajatuksena oli poistaa ne tiedostot.
jarmo@jarmo-ThinkPad-R61 ~ $ find "/home/jarmo/testi 1" -type f -size -50k -delete
---
Kiitos ja kumarrus, ei mennyt tämäkään päivä hukkaan :)
Oikeasti en ole edes miettinyt onko moinenkin mahdollista, se putkitus tule eihan selkäytimestä.
Kun tuonkin voi toki tarkistaa ennen lisävivun -delete antamista...
-
Tässä olisi kopiointi yhteen "Palautetut" kansioon:
mkdir Palautetut && find "/home/jarmo/testi 1" -type f | xargs -n 1 -I {} cp {} Palautetut
Selitys: Tuo tekee aluksi "Palautetut kansion paikkaan missä nyt olet ja vain jos tuo onnistui niin etsii sen jälkeen vain tiedostoja tuon "/home/jarmo/testi 1" kansion alta ja kaikista sen alihakemistoista kopioiden ne tuonne "Palautetut" -kansioon. Jos ihmettelet mikä on tuo kaksi aaltosulkua tuon "cp": n perässä niin ne osoittavat vain paikan minne tuon "xargs": n pitää mättää niitä tiedostonimiä (muodollinen parametri). Se että "paikanpitäjä" on juuri kaksi aaltosulkua on kerrottu tuolle "xargs" -komennolle tuolla "miinus iso-i aaltosulut" merkinnällä. Tuo "xargs" saattaa joissain tapauksissa "tökkiä" ja tuon voisi tehdä paremminkin toisella tavalla mutta ei mene noin nätisti sitten yhdelle riville. Kerro miten kävi.
Edit: Laitoinpa kasalle sen hieman toisella tavalla ilman "xargs":ia
mkdir Palautetut; find "/home/jarmo/testi 1" -type f | while read file; do cp $file Palautetut; done
eikä paljon pidempikään. Tämä versio yrittää luoda kansion "Palautetut" mutta kävi miten hyvänsä jatkaa eteenpäin (puolipiste tuolla välissä).
-
Hokkusta pokkusta vaan! Kyllä tässä on käynyt nyt sillä tavalla, että taiat ovat tehonneet. Päätteessä ei oman huomioni mukaan tullut mitään ilmoitusta, että homma olisi suoritettu. Entterin painamisen jälkeen taisi tulla vain jarmo@jarmo-ThinkPad-R61 ~ $ , joten ajattelin komennon epäonnistuneen. Tarkistin kyllä yhdestä kansiosta, että sen koko oli about 370 Mt ennen testiä ja testin jälkeen oli sama lukema, mutta siellä ilmeisesti on ollut vain muutama alle 50kt tiedosto. Tarkempi tarkastelu osoitti että kaikista kansioista oli hävinnyt alle 50kt tiedostot. Tää siis toimii, mutta pitää ottaa vielä yksi eräajo ja katsoa mikä noista komennoista.
Pienenä taka-ajatuksena avun saamisen lisäksi tämän ketjun avaamiselle oli muistuttaa ihmisiä siitä, että päätteellä voi tehdä mitä ihmeellisempiä asioita. Voi tilata vaikka pitsan kotiovelle jos vain osaa. Täytyy kyllä myöntää, että olen yllättynyt tuloksista. Googlasin ja kahlasin että löytyykö erillistä ohjelmaa, mutta eipä löytynyt. Vasta sitten muistin että pääte on keksitty. Se on kuin duunari joka tekee hommat niin kuin käsketään. Pitää osata vain oikeaa kieltä.
Pitää laitta Lenovo yöksi laulamaan loitsuja, niin eiköhän 67 gigan ja miljoonan tiedoston paketti ole aamulla jo hiukan pienempi. Pitää pyytää lisää komentoja teiltä jos vain tarvetta ilmenee. Kiitokset tähän astisista!
-
Päätteessä ei oman huomioni mukaan tullut mitään ilmoitusta, että homma olisi suoritettu.
Sehän siinä onkin hauskaa. Jos kaikki menee putkeen, mitään ei huudella, mutta jos jokin epäonnistuu niin heti vingutaan.
-
Päätteessä ei oman huomioni mukaan tullut mitään ilmoitusta, että homma olisi suoritettu.
Päätekomennot toimivat kaikki hyvin pitkälle "No news is good news" eli jos ei virheitä niin ollaan hiljaa. Tuohon on ihan syykin: Komentoja on helpompaa silloin ketjuttaa (tosin saa ne turhat viestit kyllä halutessaan ohjattua pois eli komennon lopuksi vielä perään "&>/dev/null" niin ei tule mitään viestejä, tuo ohjaa roskiin niin onnistumis- kuin virheviestitkin.
-
Tuppisuut ohjelmat saa yleensä kertomaan tekemisistään erillisellä parametrilla (usein -v, niinku verbose tai vuolas). Toisinaan vuolas ulosanti voi kuitenkin olla haitaksi. Jos vaikka kopioit hakemistopuuta toisaalle ja jonkin tiedoston kopiointi ei onnistukaan, virheilmoitus hukkuu helposti tiedostonimien sekaan.
Onneksi lähes kaikki ohjelmat palauttavat komentotulkille tilatiedon onnistuiko pyydetty komento vai ei. Tilatieto ei tavallisesti näy käyttäjälle, mutta sitä voi hyödyntää parilla loitsulla vaikka näin:
hymy() { echo -e ":\0$(($??50:51))";}
PS1="$PS1\n\$(hymy) "
... ja tiedät heti paljon paremmin meneekö hyvin vai huonosti ;)
Nuo rivit voi myös lisätä .bashrc tiedoston loppuun, jolloin tilatieto näkyy aina.
-
Pidän huomattavasti enemmän tämän näköisestä versiosta, ihan turhaan sitä kahta riviä tuohon tuhlaa:
PS1="[\u@\h \W] \$(hymy) "
Tosin Ubuntu-käyttäjillä, jotka ovat tottuneet muutenkin hakemistopolkuihin vastaava lienee:
PS1="\[\e]0;\u@\h: \w\a\]${debian_chroot:+($debian_chroot)}\u@\h:\w \$(hymy) "
Mutta taidan toistaiseksi jättää hymynaamat pois.
Muuten nopeaan testaukseen voi käyttää false ja true komentoja.