mv met " " tekens mogelijk?

Ik gebruik in Applescript behoorlijk wat shell scripts zoals cp en rsync. Beide accepteren aanhalingstekens om het pad zoals b.v. cp "/Volumes/ Macintosh HD/test.txt" "/Volumes/Macintosh HD/Test/test.txt". Dit is voor mij noodzakelijk omdat er nogal vaak spaties in paden of bestandsnamen zitten en door de aanhalingstekens hoef je je hier niet druk om te maken. Nu wil ik bestanden verplaatsen via een shell script d.m.v. het mv commando en dat kan wel alleen accepteerd mv geen aanhalingstekens. Het commando geeft een fout dat het doel niet bestaat. Bijvoorbeeld '~/A/A/*.* no such file or directory'. Ik kan het natuurlijk via de Finder doen maar dat is niet erg fraai in een programma laat staan foolproof. Via cp kan ook niet want dat zou vereisen dat op het volume minimaal de ruimte van het grootste bestand nog vrij is wat niet te garanderen is. Wie weet hier raad mee?

voor spaties en/of speciale tekens een zetten.

Dat weet ik, maar dat levert nogal problemen op. Daarom gebruik ik bij de andere commando's dus de aanhalingstekens, dan maakt het niet uit wat er tussen staat. Alle speciale tekens afvangen levert enorm veel werk op, als het dus makkelijker kan waarom zou je dan moeilijk doen?

Heb je al enkele quotes geprobeerd? Die doen in de terminal minder identificaties.

O ja, en als je in applescript werkt (en niet op de terminal) moet je wel "quoted form of 'filenaam' " gebruiken, als je shell commandos geeft. Dus bv

do shell script “echo” & quoted form of eigenstring

als er in je variabele eigenstring metakarakters voorkomen.
Alles wat je aan de commandline geeft moet je indekken met deze ‘quoted form of’ !

bovendien moet je in applescript some posix file erbij zetten ipv file, wanneer je paden in Unix
stijl (met /) opgeeft ipv Applestijl met :.
Dat hangt van de applicatie af…

Hopelijk helpt dit…

Die ~/A/A/*.* zou moeten werken. Hij er dan rekening meer dat deze tussen dubbele quotes moet staan en niet tussen enkele. Met enkele quotes vindt er geen expansion plaats waardoor er naar het bestand '~/A/A/*.*' wordt gezocht. Letterlijk dus.

Verder is de punt en tweede asterisk niet nodig aangezien een punt gelijk is aan ieder willekeurig karakter. Je zoekt dus op reeks willekeurige karakters, gevolgd door een willekeurig karakter, weer gevolgd door willekeurige karaters, terwijl je eigenlijk opzoek bent naar alleen willekeurige karakters. Mocht je alleen bestandsnamen beginnend met willekeurige karakters, gevolgd door een put en weer gevolgd dan willekeurige karakters will hebben, dan moet je de punt escapen. Dus “~/A/A/.

Als de ‘mv’ nog steeds niet lukt, laat je script dan eens zien. Dan is het waarschijnlijk makkelijker te achterhalen waar het fout gaat.

[quote:a3e290e3f9="AlexdePalex"]Die ~/A/A/*.* zou moeten werken. Hij er dan rekening meer dat deze tussen dubbele quotes moet staan en niet tussen enkele. Met enkele quotes vindt er geen expansion plaats waardoor er naar het bestand '~/A/A/*.*' wordt gezocht. Letterlijk dus.

Verder is de punt en tweede asterisk niet nodig aangezien een punt gelijk is aan ieder willekeurig karakter. Je zoekt dus op reeks willekeurige karakters, gevolgd door een willekeurig karakter, weer gevolgd door willekeurige karaters, terwijl je eigenlijk opzoek bent naar alleen willekeurige karakters. Mocht je alleen bestandsnamen beginnend met willekeurige karakters, gevolgd door een put en weer gevolgd dan willekeurige karakters will hebben, dan moet je de punt escapen. Dus “~/A/A/.
[/quote:a3e290e3f9]

Neen! Een . op de commandline betekent niet een willekeurig karakter (wel in grep en sed en
andere regexp dingen), maar op de commandline heb je standaard (in bash en tcsh, zsh heeft meer mogelijkheden): * = een willekeurige reeks karakters, evt leeg, ? = een willekeurig karakter, niet leeg,
[a-z] of [0-3] = een karakter uit e aangegeven range. Punten zijn letterlijk (waarschijnlijk omdat verborgen files met . beginnen en … de moederdirectory is, en . de huidige), en ~ staat voor home directory. Dus hier betekent . geen willekeurig karakter.
Ik heb het even uitgetest op mijn eigen homedir en daar stonden maar 2 files met een . erin.
En alleen die werden getoond met ls .

[quote:a3e290e3f9]
Als de ‘mv’ nog steeds niet lukt, laat je script dan eens zien. Dan is het waarschijnlijk makkelijker te achterhalen waar het fout gaat.[/quote:a3e290e3f9]

Daar sluit ik me bij aan…

[quote:264c70c13d="henno"]Neen! Een . op de commandline betekent niet een willekeurig karakter (wel in grep en sed en andere regexp dingen)[/quote:264c70c13d]Je hebt gelijk. Het was laat :)

[quote:b60ceb8670="henno"]Ik heb het even uitgetest op mijn eigen homedir en daar stonden maar 2 files met een . erin. En alleen die werden getoond met ls *.*[/quote:b60ceb8670] Ter duiding: het gebruik van *.* is een MS-DOS-isme dat kenmasters denk ik in die tijd opgepikt heeft :) Onder MS-DOS kunnen er geen punten in bestandsnamen staan, omdat de punt dient als scheiding tussen de bestandsnaam en -extensie; *.* betekent daar dus "alle bestandsnamen met alle extensies" terwijl het onder Unix betekent "alle bestandsnamen waar een punt in voorkomt" — wat heel wat anders is.

Bedankt voor alle reacties, het ziet er naar uit dat ik daar wel wat mee kan. Het *.* verhaal is weloverwogen gedaan en niet één of ander MS-DOS overblijfsel. * zou namelijk ook directory's kopieren terwijl *.* alleen de bestanden pakt. Misschien niet niet de fraaiste oplossing maar het werkt.

[Edit]
Oké, ff geprobeerd maar het probleem is niet hoe je die quoted form krijgt maar dat ook in terminal het mv commando gewoon niks doet als er enkele of dubbele aanhalingstekens omheen staan.
Ik heb dit getest:
mv ~/Test/temp/a.mp3 ~/Test/temp/ (Dit werkt)
mv “~/Test/temp/a.mp3” “~/Test/temp/” (Dit werkt niet)
mv ‘~/Test/temp/a.mp3’ ‘~/Test/temp/’ (Dit werkt niet)

|k heb ook nog geprobeerd de bestandsnaam in het doel te zetten maar ook dat helpt niet. Wat doe ik verkeerd?
[/edit]

De ~ wordt noch met " " noch met ' ' geexpandeerd. Ook * werkt niet met quotes, dus ls "*" gaat mis. Ook '*' zoekt een file die * heet.

Het probleem is dus de quotes in combinatie met * en ~.

Ik heb nog niet gekeken hoe dit gaat als je “quoted form of” gebruikt in Applescript.
Levert dit ook Unix-gequote dingen op? Mijn Applescript boek zegt dat je
dit standaard moet doen om een string panklaar voor de shell te maken.
Maar of dit dan ook equivalent is met " " op de comandline zelf, weet ik niet.

Misschien nog een experiment waard. (commando weg laten schrijven naar een file voordat je hem daadwerkelijk uitvoert bv).

quoted form levert dit op: 'commando...' dat werkt wel, maar ik quote normaal zelf in Applescript met " " en dat werkt ook goed. Ik was er inmiddels zelf ook achter dat * quoten niet kan. Dat is niet zo heel erg want dan gebruik ik wel gewoon een lijst van bestanden in die map. Het duurde alleen ff voordat duidelijk was wat nou precies de fout was. Bedankt voor ieders hulp.

[quote:8efce6c34a="kenmasters"]Het *.* verhaal is weloverwogen gedaan en niet één of ander MS-DOS overblijfsel. * zou namelijk ook directory's kopieren terwijl *.* alleen de bestanden pakt. Misschien niet niet de fraaiste oplossing maar het werkt.[/quote:8efce6c34a] Alleen zolang er geen punten in de directorynaam staan, en al je bestanden er wel eentje hebben … Ikzelf heb bijvoorbeeld zat (tekst)bestanden zonder extensie, omdat ik daar de noodzaak niet van inzag op m'n vroegere Linux PC (onder OS X ook niet, maar je moet soms wat moeite doen om die extensie weg te krijgen, dus laat ik hem gewoon staan :)) en die zouden dus door jouw script niet meegenomen worden.

Maar zolang het voor jou werkt is er niks aan de hand :slight_smile:

Als ik het eenregelige Applescript

do shell script “ls ~/*”

doe dan krijg ik netjes de inhoud van alle directories onder mijn home, en

do shell script “ls ~”

geeft mijn homedirectory inhoud.

Dus het lijkt met dat quoten van * en ~ in Applescript ‘do shell script’ wel degelijk kan.

Kun je niet je script(fragment) posten?

Dit kan wel: do shell script "ls ~/" maar dat is niet ge-quote. Dit wordt als ls ~/ uitgevoerd. ge-quote zou dit zijn: ls '~/' en dat kan niet. Het probleem was dat ik er niet aan gedacht had dat je wildcards en dergelijke niet kunt quoten omdat er, zoals al genoemd werd, naar een bestand genaamd * gezocht wordt. Ik heb het wel op kunnen lossen door een lijst te maken in Applescript, werkt prima maar kost iets meer code.

Ok, maar als je spaties wilt vermijden, kun je de filenamen met spaties (die ik overigens zelden gebruik, omdat ik bv op mn werk Linux en Unix gewend ben, en niet steeds wil quoten) met enkele quotes binnen de " " gebruiken. Dus ls "~/'filenaam met spatie'/* " heeft het voordeel van wel ~ en * kunnen gebruiken, maar ook filenamen met spatie. Misschien heb je er wat aan.

Ik heb het momenteel niet nodig maar de suggestie is natuurlijk erg welkom want de kans dat ik het vaker tegenkom is vrij groot. Ik ben redelijk bekend met Linux/UNIX maar dit wist ik nog niet.

misschien ten overvloede: de dubbele quotes gebruik je dus niet opde commandline (want zoals opgemerkt werken * en ~ e.d. niet onder dubbele (of enkele) quotes, maat als argumentstring in een do shell script, dus in Applescript

do shell script “ls ~/‘filenaam met spaties’/*”

geeft een lijst van alle files in de ‘filenaam met spaties’, plus inhoud van de evt subdirectories.
De gewone files (dus geen links, programma’s en directories bv) kun je er eventueel met
shell truuks uithalen, of zsh gebruiken (die veel meer wildcards op de commandline ondersteund,
o.a. om gewone files te listen).

happy scripting!