Script-hajer søges :-)

mich
Antal: 935
Tilmeldt:
13-10-2007
User is offline
Script-hajer søges :-)

Mit lille script til at checke om lokale filer også findes på de eksterne harddiske kan desværre ikke finde ud af filnavne med mellemrum. Det er jo en kedelig situation, så jeg håber, at en af jer script-hajer kan hjælpe mig med at finde det manglende " eller ;
Her er, hvad jeg anser for den væsentligste del af scriptet:

for l in $(find ./ -iname "$fn")
do
  if (( ${#remote_disk} > 0 )); then
    local_file="$l"
    remote_file="$remote_dir${local_file:1}"
    if [[ ! -e "$remote_file" ]]; then
      echo "$local_file mangler på $remote_disk"
      echo "$local_file" >> /tmp/missing.tmp
      if [ "$L_only" = "false" ]; then
        cp -pT $local_file $remote_file
      fi 
    fi 
  fi 
  echo $(dirname $l) >> /tmp/rawfiles.tmp
done

du -ch $(cat /tmp/rawfiles.tmp | sort -u) >> "$dir_log"
rm -f /tmp/rawfiles.tmp
cat /tmp/missing.tmp | sort >> "$missing_log"
rm -f /tmp/missing.tmp

I mine tests er
"$fn" = "*"
$remote_disk og $remote_dir henviser til den eksterne disk.

Det hele fungerer perfekt, bortset fra at filnavne med mellemrum bliver klippet før mellemrummet i $missing_log.

Now is time for your woodoo, sharks!

Spørg endelig, hvis I mangler oplysninger.

./mich


johnnyec
Antal: 44
Tilmeldt:
20-01-2008
User is offline
jeg er ingen haj men jeg vil

jeg er ingen haj men jeg vil tro du kan bruge

sort -t\n

har du ikke problemer med spaces i din

cp -pT $local_file $remote_file

det ville jeg i hvert fald have gættet på


dudsen
Antal: 963
Tilmeldt:
10-01-2009
User is offline
sed

den svære men korrecte måde ville værre at rode med finds -print0 eller -fprint0 output formatering, den slags er jeg for doven til så her er et sed eksempel istedet.

find |sed 's/ /\\ /g' |xargs stat

jeg bruger en simpel søgning of piper til stat via xargs for lige at teste.
i dit exempel burde det virke hcis du ersttatter $(find ./ -iname "$fn") med $(find ./ -iname "$fn" | sed 's/ /\\ /g' )

Håber det hjælp dig nærmere til en løsning.


mrbrown79
Antal: 470
Tilmeldt:
12-01-2010
User is offline
Det hele fungerer

#0: Det hele fungerer perfekt, bortset fra at filnavne med mellemrum bliver klippet før mellemrummet i $missing_log.

Jeg er ikke vild med kombinationen af "for" og navne med mellemrum. Du må have kildet den under hagen (med IFS?) for at få ovenstående til at virke, eller?

Jeg tror while er bedre til formålet for den kører på linjeskift (ligesom output af find).

missing_log="missing.log"
touch $missing_log
rm $missing_log

find -iname "*.txt"  | while read localFile
     do
remoteFile="../remotedir/$localFile"
( [ ! -e "$remoteFile" ] && echo "$remoteFile does not exist" || echo "$remoteFile DOES exist" ) >> $missing_log
     done


mich
mich's picture
Antal: 935
Tilmeldt:
13-10-2007
User is offline
Tak for jeres input

Jeres input er værdsat og vil blive studeret nærmere.

Selv om det er lykkedes mig at lave nogle nyttige scripts i tidens løb, er jeg bestemt ingen ørn til bash scripting, som I sikkert kan se, og finder ofte syntaksen kontraintuitiv eller inkonsistent.

Som regel undgår jeg mellemrum i filnavne, men de sniger sig ind af og til alligevel, og i et script, der skal tage backup eller kontrollere, at den er korrekt, må man jo også tage højde for den mulighed.

#1:
cp -pT $local_file $remote_file
ville sikkert have givet problemer, som du skriver, med da jeg kørte alle tests med
L_only="true"  # log only
blev cp aldrig udført.

./mich


dudsen
Antal: 963
Tilmeldt:
10-01-2009
User is offline
du er ikke den eneste

#4:
Selv om det er lykkedes mig at lave nogle nyttige scripts i tidens løb, er jeg bestemt ingen ørn til bash scripting, som I sikkert kan se, og finder ofte syntaksen kontraintuitiv eller inkonsistent.

du er ikke den eneste, Bash har sine problemer som script sprog især omkring whitespace hvor folk ofte tyr til sed, perl eller awk oneliners for fixe problemerne, og subshell er et kapitel for sig, det er nogle gange halvsvært self for erfarne brugere at holde snor i bash, men det giver dig en muglighed for at konvertere manuelt workflow til script uden at skifte syntax, eller lære formel programering.

#3: Jeg er ikke vild med kombinationen af "for" og navne med mellemrum. Du må have kildet den under hagen (med IFS?) for at få ovenstående til at virke, eller?
Det løser vel ikke rod problemet at mv cp, cat, echo, osv opdatter whitespace som seperator?


mrbrown79
Antal: 470
Tilmeldt:
12-01-2010
User is offline
Det løser vel ikke rod

#5: Det løser vel ikke rod problemet at mv cp, cat, echo, osv opdatter whitespace som seperator?

echo er ligeglad med white-spaces - den skriver, det den bliver bedt om uanset whitespaces.

Derfor: Punkt 1 var at få (for/while) loop'en til at fungere. Hvis for-loopen ikke fungerer forklarer det jo også hvorfor echo til fil ikke fungerede for filnavne med mellemrum (som skrevet i #0).

I min erfaring kan man enten escape whitespaces eller omklamre hele stien med anførselstegn. Jeg foretrækker det sidste fordi den også er resisitent overfor andre specialkarakterer i filnavne - fx '-' ("minus").

Flg. har jeg lige testet og det virker for filer med mellemrum inkl. cp kommando:

missing_log="missing.log"
touch $missing_log
rm $missing_log
find -iname "*.txt"  | while read localFile
     do
remoteFile="../remotedir/$localFile"
( [ ! -e "$remoteFile" ] && echo "$remoteFile does not exist - copying.." && cp "$localFile" "$remoteFile" ) >> $missing_log

     done


mich
mich's picture
Antal: 935
Tilmeldt:
13-10-2007
User is offline
Tak igen

Tak igen for jeres kommentarer. Jeg vil, som tidligere nævnt, studere jeres guldkorn med interesse.
#5:
Tak for opbakningen. Det er rart at vide, at man ikke er den eneste.
Muligheden for at automatisere et ellers manuelt workflow er jo det centrale, men jeg har da sommetider overvejet, om ikke det var værd at prøve med et andet sprog.

#6:
Ja, jeg havde også tænkt på at prøve med anførselstegn, som jeg i andre sammenhænge har brugt flittigt og med held, men det er nok blevet ved tanken, eller også har jeg ikke testet det godt nok. Tak for at minde mig om det.

I øvrigt forstår jeg ikke meningen med

touch $missing_log
rm $missing_log

./mich


frogmaster
frogmaster's picture
Antal: 3347
Tilmeldt:
20-05-2010
User is offline
Ja, jeg havde også

#7: Ja, jeg havde også tænkt på at prøve med anførselstegn, som jeg i andre sammenhænge har brugt flittigt og med held, men det er nok blevet ved tanken, eller også har jeg ikke testet det godt nok. Tak for at minde mig om det.

Det er beskrevet rigtig mange steder, og som nævnt fyldt med problematikker. Jeg skal gerne indrømme at jeg ikke gider selv.

https://www.google.dk/webhp?sourceid=chrome-instan...

#7: $missing

Så vidt jeg husker, at finde mapper/filer uden specificeret fil type i bash.

# remove old logs
    if [ -f "$missing_log" ]; then
        rm $missing_log
    fi

Måske er det nemmere at løse det overordnede problem i f.eks. Python?


mrbrown79
Antal: 470
Tilmeldt:
12-01-2010
User is offline
I øvrigt forstår jeg

#7: I øvrigt forstår jeg ikke meningen med..

touch $missing_log
rm $missing_log

Det var bare en hurtig (og doven) måde at slette den gamle log. Problemet var at rm giver en fejl, hvis filen ikke eksisterer. "touch" sikrer at der er en fil med det pågældende navn. Jeg kunne også have brugt rm -f. Eller tjekket for filens eksistens, som frogmaster gør i den bid kode, som han har snuppet fra Google (og lader som om han lige hiver frem fra hukommelsen - uden rigtig at forstå den) i #8.


frogmaster
frogmaster's picture
Antal: 3347
Tilmeldt:
20-05-2010
User is offline
(og lader som om han

#9: (og lader som om han lige hiver frem fra hukommelsen - uden rigtig at forstå den)

Det er korrekt jeg ikke husker bash i detaljer, og at jeg søger på løsninger før jeg svarer. Også at jeg kan tage fejl, selv hvor jeg har min ekspertiser, men prøv for fanden at lade være med at opføre dig som en fucking psykopat.


mrbrown79
Antal: 470
Tilmeldt:
12-01-2010
User is offline
Beklager afsporing af tråd,

Beklager afsporing af tråd, mich :(

#10: Også at jeg kan tage fejl, selv hvor jeg har min ekspertiser, men prøv for fanden at lade være med at opføre dig som en fucking psykopat.

Wow. Hvem er mest mentalt belastet:
* ham, der, på et forum, hvor man optræder anonymt, prøver at lade som om han ved en helt masse om et emne, hvor han ikke aner en tøddel
* eller ham, der påpeger det?

Der er ikke noget i vejen med at google-søge og kopiere svaret, men lad nu vær med at forsøge at tillægge dine svar et troværdighedsniveau, som de ikke kan bære. Hvis du finder et svar, baseret på nogle termer, der tilfældigvis rammer samme emne, så skriv det for hulen da!

Skriv: "jeg ved ikke meget om emnet, men måske du kan bruge disse søge-resultater". Lad vær med at finde på en dækhistorie om at "du måske husker forkert, men det er vist noget i retning af....". Et "-f" check i bash har jo intet med at finde en fil at gøre. At du kan søge på "$missing_log" på google og så kopiere første forekomst: https://github.com/wyuka/kdesdk/blob/master/script... , der intet har med at finde filer at gøre, er jo for langt ude! Til din orientering: "$missing_log" er et variabelnavn (et vilkårligt valgt navn) og at du finder den på google er en ren tilfældighed, der intet har med mich's forespørgsel at gøre.

Det er problematisk, at du svarer på ting, du ikke ved noget om og samtidig forsøger at gøre dem troværdige, ved at lade som om du er ekspert. Du gør det igen og igen - så lad da vær!

Det næste bliver at du finder en løsning, der - mod forventning - sletter harddisken og gengiver den til en intetanende bruger, som kopierer den i den tro at du ved noget om det.


frogmaster
frogmaster's picture
Antal: 3347
Tilmeldt:
20-05-2010
User is offline
Wow. Hvem er mest

#11: Wow. Hvem er mest mentalt belastet

Det er du uden tvivl. Denne gang høster du en klage for din opførsel.

#11: Det næste bliver at du finder en løsning, der - mod forventning - sletter harddisken og gengiver den til en intetanende bruger, som kopierer den i den tro at du ved noget om det.

Du har før optrådt psykopatisk. Nu stopper det ...


mrbrown79
Antal: 470
Tilmeldt:
12-01-2010
User is offline
Denne gang høster du

#12: Denne gang høster du en klage for din opførsel

Tak. Passende med en klage på denne tråd. Dine udfald er langt under sidens niveau.

#12: Du har før optrådt psykopatisk

Så nu er du også ekspert i psykologi? Du er bekymrende fascineret af psykopatbegrebet. Jeg kan kun gisne om hvorfor.

#12: Nu stopper det

Sålænge jeg har adgang til denne side, har jeg tænkt mig at påtale når dine svar er latterlige - det skylder jeg de evt. uerfarnce brugere, der ikke selv kan vurdere det. Uanset, hvor meget du kommer til at hade det og hvilke ting, du kalder mig.


frogmaster
frogmaster's picture
Antal: 3347
Tilmeldt:
20-05-2010
User is offline
Du skal bare tale

Du skal bare tale ordentligt. Men klagen er sendt. Jeg har ingen interesse i at gøre mere ud af det, og jeg respektere din viden, men der er grænser for hvad du kan tillade dig at knalde af. Du skal ikke fyre det pis af igen ...


mrbrown79
Antal: 470
Tilmeldt:
12-01-2010
User is offline
Du skal ikke fyre det

#14: Du skal ikke fyre det pis af igen

Igen: uanset, hvor grimt du taler, har du absolut ingen indflydelse på hvad jeg kommenterer.


frogmaster
frogmaster's picture
Antal: 3347
Tilmeldt:
20-05-2010
User is offline
Jeg har ingen interesse i

Jeg har ingen interesse i hvad du kommenterer, udover hvor jeg er involveret, men gør du det, så skal du fame tale i en acceptabel tone. Vi behøver ikke være enige, og har du ret, så vil jeg ende med at give dig ret, som jeg vil med alle andre.

Her går du bare over grænsen.


marlar
Antal: 2823
Tilmeldt:
05-12-2009
User is offline
Okay, stop venligst her! I

Okay, stop venligst her!

I er begge kommet for langt ud. Frogmaster erkender et forbehold for koden ved at skrive "så vidt jeg husker" - om så hukommelsen er støttet af en googlesøgning er så noget andet som i mine øjne ikke er specielt relevant. Der er tit ting som er meget diffuse i min erindring som jeg derfor googler, men derfor kan det jo godt udgå fra hukommelsen. Frogmaster har hjulpet rigtigt mange mennesker herinde, om det sker via Google er irrelevant i mine øjne.

På den anden side er det ikke i orden at kalde en anden bruger"fucking psykopat". Det er ærligt talt under lavmålet og tjener intet formål. Der er intet psykopatisk i mrbrown79's opførsel iflg. min forståelse af diagnosen, men jeg lader nu psykiatere om at diagnosticere psykiske sygdomme. Man kan måske kalde det dårlig stil og manglende respekt at skrive som i #9, men lad os holde os væk fra kliniske diagnoser.

Tilbage til emnet, tak!


linuxuser42
linuxuser42's picture
Antal: 185
Tilmeldt:
05-01-2008
User is offline
Hvad med en dry rsync? (kan

Hvad med en dry rsync? (kan evt. Googles :-) )


marlar
Antal: 2823
Tilmeldt:
05-12-2009
User is offline
rsync er fantastisk godt til

rsync er fantastisk godt til backup, men som jeg forstår #0 så er det ikke sagen her. Han vil gerne tjekke om filer på den lokale maskine findes på backupdrevene, men det jo være i en hel anden mappestruktur, og så dur rsync jo ikke.

Men ellers er det da rigtigt at en rsync dry run er godt til at finde forskelle imellem mappestrukturer. Her gætter jeg bare på at strukturen ikke er ens.


dudsen
Antal: 963
Tilmeldt:
10-01-2009
User is offline
while

#6:
echo er ligeglad med white-spaces - den skriver, det den bliver bedt om uanset whitespaces.

Derfor: Punkt 1 var at få (for/while) loop'en til at fungere. Hvis for-loopen ikke fungerer forklarer det jo også hvorfor echo til fil ikke fungerede for filnavne med mellemrum (som skrevet i #0).

I min erfaring kan man enten escape whitespaces eller omklamre hele stien med anførselstegn. Jeg foretrækker det sidste fordi den også er resisitent overfor andre specialkarakterer i filnavne - fx '-' ("minus").

Jeg er lidt halvparanoid om altid at escape whitespaces men mest fordi jeg har brændt nællerne på det ofte nok. Og oftenst har løsningen for mig været regex(min go to maslow's hammer)

Interesant iøvrigt at while og for bruger forskellige item seperatorer den vil jeg huske til fremtidig brug.

edit: pga forumets whitespace problem ;-)