hur escapa ' i en sträng i detta kommando?

Permalänk
Medlem

hur escapa ' i en sträng i detta kommando?

Tja,
Har under mina två år med Debian och Freenas(/freeBSD) fastnat för detta kommando när jag vill trimma bort strängar ur filnamn:

find . -type f -name '*gammal sträng*' -execdir bash -c 'mv "$1" "${1/gammal sträng/}"' -- {} \;

Det har hittills funkat fint! Mellanslag i gammal sträng behöver inte escapas, däremot måste specialtecken som [ escapas. Men idag försöker jag trimma bort strängen l'Islam från en massa filer, och det enkla citationstecknet strular till det. Funker inte utan escape och funkar inte med escape. Får Unmatched '"' till svar.

Nån som har nåt tips. Vill gärna hålla mig till detta kommando, inga for loopar och sånt.

Permalänk
Medlem
Permalänk
Medlem

Du kan använda 'l'\''Islam', d.v.s. avsluta en '-sträng, infoga ett escapat ', starta nästa '-sträng. Ett annat alternativ är att bara använda "l\'Islam", d.v.s. använd dubbel-citat för strängen istället.

Sen vet jag inte om du missat rename-kommandot, eller om du föredrar find av någon annan anledning.

Permalänk
Medlem

Du kan använda -regex istället för -name om du inte får fart på det

Permalänk
Medlem
Skrivet av varget:

Nej, det funkar inte som vanligt.

Skrivet av perost:

Du kan använda 'l'\''Islam', d.v.s. avsluta en '-sträng, infoga ett escapat ', starta nästa '-sträng. Ett annat alternativ är att bara använda "l\'Islam", d.v.s. använd dubbel-citat för strängen istället.

Sen vet jag inte om du missat rename-kommandot, eller om du föredrar find av någon annan anledning.

Jag har inte missat rename, men läste typ nånstans att det var deprecated eller nåt så jag bestämde mig för att börja linuxäventyret (för två år sen) utan rename, och har så lyckats hamra fram det här find-kommandot som funkat bra hittillls. Och jag tänkte liksom stanna vid problemet och lösa det för att lära mig, snarare än att kringgå med ett annat kommando.

Angående dina förslag ovan, jag hade provat dem men det funkar inte heller. Kanske lättast att bara visa vad som händer i terminalen. Tog med det första bytet till Islamey bara för at visa att det inte är nåt annat fel, har även redan skalat ner filnamnen med detta kommando fast då skalat bort saker som inte hade apostrof.

Det är ju redan enkla ' runt mv-kommandot och sen är det dubbla " för att ange $1 etc, det är ett attans tungvrickande. Kanske regex är enda chansen.

root@freenas /mnt/TANK/bibliotek/video/annat/tv/Jesus and Islam/Season 1 % ls -la total 7287968 drwxrwxr-x+ 2 root linux_user 9 Oct 3 11:26 . drwxrwxr-x+ 3 linux_user linux_user 3 Oct 3 11:24 .. -rwxrwxr-x+ 1 linux_user linux_user 1066623055 Dec 24 2017 S01E01 La crucifixion selon le Coran.mkv -rwxrwxr-x+ 1 linux_user linux_user 1055257314 Dec 24 2017 S01E02 - Les gens du Livre.mkv -rwxrwxr-x+ 1 linux_user linux_user 1053467510 Dec 24 2017 S01E03_l'Islam - Fils de Marie.mkv -rwxrwxr-x+ 1 linux_user linux_user 1069617999 Dec 24 2017 S01E04_l'Islam - L'exil du Prophète.mkv -rwxrwxr-x+ 1 linux_user linux_user 1082180229 Dec 24 2017 S01E05_l'Islam - Mahomet et la Bible.mkv -rwxrwxr-x+ 1 linux_user linux_user 1076565801 Dec 24 2017 S01E06_l'Islam - La religion d’Abraham.mkv -rwxrwxr-x+ 1 linux_user linux_user 1060916166 Dec 24 2017 S01E07_l'Islam - Le livre de l’islam.mkv root@freenas /mnt/TANK/bibliotek/video/annat/tv/Jesus and Islam/Season 1 % find . -type f -name "*l'Islam*" -execdir bash -c 'mv "$1" "${1/Islam/Islamey}"' -- {} \; root@freenas /mnt/TANK/bibliotek/video/annat/tv/Jesus and Islam/Season 1 % ls -la total 7287968 drwxrwxr-x+ 2 root linux_user 9 Oct 7 20:39 . drwxrwxr-x+ 3 linux_user linux_user 3 Oct 3 11:24 .. -rwxrwxr-x+ 1 linux_user linux_user 1066623055 Dec 24 2017 S01E01 La crucifixion selon le Coran.mkv -rwxrwxr-x+ 1 linux_user linux_user 1055257314 Dec 24 2017 S01E02 - Les gens du Livre.mkv -rwxrwxr-x+ 1 linux_user linux_user 1053467510 Dec 24 2017 S01E03_l'Islamey - Fils de Marie.mkv -rwxrwxr-x+ 1 linux_user linux_user 1069617999 Dec 24 2017 S01E04_l'Islamey - L'exil du Prophète.mkv -rwxrwxr-x+ 1 linux_user linux_user 1082180229 Dec 24 2017 S01E05_l'Islamey - Mahomet et la Bible.mkv -rwxrwxr-x+ 1 linux_user linux_user 1076565801 Dec 24 2017 S01E06_l'Islamey - La religion d’Abraham.mkv -rwxrwxr-x+ 1 linux_user linux_user 1060916166 Dec 24 2017 S01E07_l'Islamey - Le livre de l’islam.mkv root@freenas /mnt/TANK/bibliotek/video/annat/tv/Jesus and Islam/Season 1 % find . -type f -name "*l'Islam*" -execdir bash -c 'mv "$1" "${1/'_l'\''Islamey'\ -/}"' -- {} \; Unmatched '"'. root@freenas /mnt/TANK/bibliotek/video/annat/tv/Jesus and Islam/Season 1 % find . -type f -name "*l'Islam*" -execdir bash -c 'mv "$1" "${1/'_l'\''Islamey'\ '-'/}"' -- {} \; Unmatched '"'. root@freenas /mnt/TANK/bibliotek/video/annat/tv/Jesus and Islam/Season 1 % find . -type f -name "*l'Islam*" -execdir bash -c 'mv "$1" "${1/'_l'\''Islamey'/}"' -- {} \; Unmatched '"'. root@freenas /mnt/TANK/bibliotek/video/annat/tv/Jesus and Islam/Season 1 % find . -type f -name "*l'Islam*" -execdir bash -c 'mv "$1" "${1/'l'\''Islamey'/}"' -- {} \; Unmatched '"'. root@freenas /mnt/TANK/bibliotek/video/annat/tv/Jesus and Islam/Season 1 % find . -type f -name "*l'Islam*" -execdir bash -c 'mv "$1" "${1/"l\'Islamey"/}"' -- {} \; Unmatched '''. root@freenas /mnt/TANK/bibliotek/video/annat/tv/Jesus and Islam/Season 1 % find . -type f -name "*l'Islam*" -execdir bash -c 'mv "$1" "${1/\"l\'Islamey\"/}"' -- {} \; Unmatched '"'.

Skrivet av Hothep:

Du kan använda -regex istället för -name om du inte får fart på det

Är ännu sämre på regex än på citationstecken...

Permalänk
Medlem
Skrivet av guermantes:

Jag har inte missat rename, men läste typ nånstans att det var deprecated eller nåt så jag bestämde mig för att börja linuxäventyret (för två år sen) utan rename, och har så lyckats hamra fram det här find-kommandot som funkat bra hittillls. Och jag tänkte liksom stanna vid problemet och lösa det för att lära mig, snarare än att kringgå med ett annat kommando.

rename är en del av util-linux och kan ses som inbyggt i Linux, det verktyget lär inte tas bort i första taget eftersom det skulle orsaka ett enormt kaos. Det är även rejält mycket enklare att använda, kommandot för att trimma bort l'Islam från alla filerna i katalogen är bara rename "l'Islam" "" *.

Men om du verkligen vill använda find istället så verkar detta fungera:

find . -type f -name "*l'Islam*" -execdir bash -c 'mv "$1" "${1/l"'\''"Islam/}"' -- {} \;

D.v.s. samma princip att avsluta en sträng, infoga ett ', och börja nästa sträng som jag beskrev tidigare. Jag missade bara att strängen i sig var en del av en '-sträng.

Permalänk
Medlem
Skrivet av perost:

Men om du verkligen vill använda find istället så verkar detta fungera:

find . -type f -name "*l'Islam*" -execdir bash -c 'mv "$1" "${1/l"'\''"Islam/}"' -- {} \;

D.v.s. samma princip att avsluta en sträng, infoga ett ', och börja nästa sträng som jag beskrev tidigare. Jag missade bara att strängen i sig var en del av en '-sträng.

Eureka! (även om det inte var jag som kom på det.)
Tack!

Men jag förstår inte varför det funkade? I min värld så trodde jag att det fjärde dubbla " efter mv skulle tolkas som att det stänger efter det tredje snarare än öppnar inför det femte, och därmed skulle enheten brytas itu... För om det inte är så att det inte öppnar inför det femte så förstår jag inte hur bash/csh kan förstå att "${1/l"'\''"Islam/}" tolkas som en "enhet"? Jag trodde att citationstecknen enkla/dubbla var delimiters. Men är det i själva verket mellanslaget som är delimiter? Edit: vilket kanske är helt logiskt trots allt med tanke på mv gammaltnamn nyttnamn

Permalänk
Medlem

@guermantes: Inte helt säker vad det är du frågar, men strängar utan något mellan slås ihop av bash. D.v.s. "sträng1""sträng2" är samma sak som "sträng1sträng2". Så lösningen var att dela upp kommandosträngen i tre delar: 'mv "$1" "${1/l"', \', och '"Islam/}"'.

Permalänk
Avstängd
Skrivet av guermantes:

Tja,
Har under mina två år med Debian och Freenas(/freeBSD) fastnat för detta kommando när jag vill trimma bort strängar ur filnamn:

find . -type f -name '*gammal sträng*' -execdir bash -c 'mv "$1" "${1/gammal sträng/}"' -- {} \;

Det har hittills funkat fint! Mellanslag i gammal sträng behöver inte escapas, däremot måste specialtecken som [ escapas. Men idag försöker jag trimma bort strängen l'Islam från en massa filer, och det enkla citationstecknet strular till det. Funker inte utan escape och funkar inte med escape. Får Unmatched '"' till svar.

Nån som har nåt tips. Vill gärna hålla mig till detta kommando, inga for loopar och sånt.

Prova med -i:

find . -type f -name '*gammal sträng*' -execdir bash -c 'mv -i "$1" "${1/gammal sträng/}"' -- {} \;

Permalänk
Medlem

Jag brukar använda detox för att enkelt städa filnamn från olämpliga tecken. Det verktyget borde ju förenkla allting en del för dig.

Visa signatur

Spara på minnen, inte saker.