Många gånger behöver vi köra ett skript antingen för att konvertera en pdf till text, konvertera .doc-filer till html, etc; Poängen är att dessa kommandon bara accepterar en fil i taget och det är väldigt tråkigt om vi behöver utföra samma uppgift på flera filer, speciellt när vi utför ett skript.
Jag föreslår en lösning för detta problem med hjälp av ls, törst, grep, awk y sh. Vad vi kommer att göra är att skapa rätt kommandorad i varje rad och köra dem med sh, och eftersom sh kommer att köra en rad i taget kommer det inte att öka förbrukningen av ramminne som med andra metoder till och med kan frysa maskiner med låg effekt.
Låt oss se hur man utför denna kommandosekvens.
1- Det första vi måste göra är att introducera filerna som kommer att användas av ls:
ls --directory /camino/a/carpeta/*.ext
2- Då behöver vi de filerna skickas inom citattecken «/sökväg/till grupp av
filer«
ls --directory /camino/a/carpeta/*.ext | sed 's/^/"/' | sed 's/$/"/'
3- Nu awk du kommer att vara redo att ta emot uppgifterna.
ls --directory /camino/a/carpeta/*.ext | sed 's/^/"/' | sed 's/$/"/' | awk '{print $0}'
eftersom awk har sitt eget språk kommer vi att behöva separera citattecken som vi vill visas för att citera en text bland andra funktioner som vi kommer att behöva använda omvänt snedstreck \ Låt oss se hur man separerar några.
separera ett citat
\”
Visa ett snedstreck i utgången (vi måste skriva tre snedstreck)
\\\
Ibland kommer vi att behöva en isolatoravgränsare, bara texten eller citattecken som visas i de två omvända snedstrecket kommer att matas ut:
'""'\"\'""'
4- Låt oss se hur du byter namn på alla filer som är listade med kommandot mv bara för att ange ett suffix. (Nu för att lista filen måste vi använda kombinationen "$0" när vi behöver använda den)
ls --directory /camino/a/carpeta/*.ext | sed 's/^/"/' | sed 's/$/"/' | awk '{print "mv "$0" \"`dirname
"$0″`/Text-any-`basename "$0″`\" "}' | sh
Anteckning läggs till i slutet som visas i föregående sekvens kombinationen « | sh » som omdirigerar röret till detta skal
Låt oss titta på några exempel förberedda för att skapa ett manus.
Exempel:
1- Konvertera alla pdf som är listade i textfiler.
ls --directory “$@” | sed 's/^/"/' | sed 's/$/"/' | awk '{print "pdftotext",$0}' | sh
2- Låt oss säga att vi vill applicera en effekt på en bild men utan att ändra originalet, låt oss se ett exempel med vågeffekten, välkänd för Windows XP-logotypen, eftersom det är en flagga med vågiga effekter (för att bättre uppskatta denna effekt, det rekommenderas att använda som resulterande bildtillägg .png).
ls --directory “$@” | sed 's/^/"/' | sed 's/$/"/' | awk '{print FS="convert -wave 25x150
"$0"","\"\`dirname "$0"`/`basename "$0" | sed '"'"s/\\\\.[[:alnum:]]*$//"'"'`-wave.`basename "$0" |
rev | awk -F . \'"'"'\{print $1}\'"'"'\ | rev`'""'\"\'""' "}' | sh
Obs: flera pass görs i denna sekvens:
- En för att få mappen där filen med dirname finns
- En annan för att få basnamnet, men att ta bort filtillägget
- En annan för att få befrielse från nämnda fil.
3- Låt oss nu se hur man byter namn på en grupp filer genom att sätta motsvarande nummer framför namnet (numeriskt suffix).
ls --directory “$@” | sed 's/^/"/' | sed 's/$/"/' | awk '{print FS="mv "$0" '""'\"\'""'`dirname
"$0"`/"FNR"-`basename "$0"`'""'\"\'""' "}' | sh
Låt oss se hur man sätter ett numeriskt prefix (sätt ett nummer i slutet, men före undantaget) det här alternativet är endast giltigt om filen har ett tillägg.
ls --directory “$@” | sed 's/^/"/' | sed 's/$/"/' | awk '{print FS="mv "$0" \"`dirname
"$0"`/`basename "$0" | sed '\'s/\\\\.[[:alnum:]]*$//\''`-"FNR".`echo "$0" | rev | awk -F .
'""'\'\'""'{print $1}'""'\'\'""' | rev `\" " }' | sh
4- Låt oss se ett exempel där vi måste ange data eller välja en grupp funktioner, som ett exempel där vi tar bort lösenordsskydd från flera pdf-filer som har samma lösenord. (I det här fallet kommer vi att använda Zenity som dialogruta)
zenity --entry --hide-text --text "introduzca la clave de desbloqueo" > $HOME/.cat && ls
--directory “$@” | sed 's/^/"/' | sed 's/$/"/' | awk '{print FS="pdftk "$0" input_pw `cat
$HOME/.cat` output \"`dirname "$0"`/`basename "$0" .pdf`-unlock.pdf\" "}' | sh && rm
$HOME/.cat
Som du såg är målet att göra en katt av en fil som bara skapas i början av raden en gång och sedan raderas den när konverteringen är klar.
5- Ett annat verktyg är när vi behöver packa upp flera filer komprimerade i .zip
ls --directory “$@” | sed 's/^/"/' | sed 's/$/"/' | awk '{print "unzip -x "$0" "}' | sh
Exempel
"unzip -x "$0" "
6- Låt oss se ett exempel för att skydda en pdf med ett lösenord som tillåter läsning men skyddat mot kopieringsutskrift eller andra alternativ, (alternativen som listas i dialogrutan kommer att vara de som kommer att tillåtas i pdf:en, om du inte vill tillåt någon av dem, välj inte någon).
zenity --separator " " --multiple --text "Seleccione los Opciones que quiere permitir" --column "Opciones" --list "Printing" "DegradedPrinting" "ModifyContents" "CopyContents" "ScreenReaders" "ModifyAnnotations" "AllFeatures" > $HOME/.cat && zenity --entry --hidetext --text "Teclee la contraseña de protección" > $HOME/.cat2 && ls --directory "$@" | sed 's/^/"/' | sed 's/$/"/' | awk '{print FS="echo \"pdftk \\\"`echo "$0"`\\\" output \\\"`dirname "$0"`/`basename "$0" .pdf`-locked.pdf\\\" allow `cat $HOME/.cat` owner_pw \"`cat $HOME/.cat2`\"\" | sh "}' | sh && rm $HOME/.cat $HOME/.cat2
Med dessa exempel är det ganska exemplifierat hur man använder det här alternativet för att konvertera, ändra eller byta namn på flera filer med ett enda skript och inte konvertera dem manuellt en efter en. Minnesförbrukningen med detta alternativ är minimal, beroende på vilket kommando som används, eftersom det inte konverterar dem samtidigt utan en efter en.
ls --directory %F | sed 's/^/"/' | sed 's/$/"/' | awk '{print "script-convertir-video "$0" "}' | sh && zenity --info --text "Todas las conversiones han terminado"
FIN
Skulle det inte vara mycket, MYCKET lättare att göra allt detta med vanliga uttryck eller jokertecken? Jag förstår inte vad skillnaden är mellan det och att göra livet så komplicerat med det här.
Sanningen är att du har stor kunskap om linux-kommandon. Mycket användbart!
Ja, jag vet att vi kommer att lära oss mycket med honom här hahaha.
Jag tror att det här är mycket lättare:
ls -d /sökväg/till/mapp/*.ext | medan du läser filen; gör KOMMANDO "$file"; donera
Istället för COMMAND kan du lägga vad du vill och det fungerar även om filerna innehåller blanksteg så länge du sätter $file inom citattecken. Du behöver inte använda sed för det eller generera kommandona med awk. Detta startar också färre processer.
o:
för i i $(ls -d /sökväg/till/mapp/*.ext); KOMMANDO "$i"; donera;
Det låter bra, men om filnamnen innehåller blanksteg fungerar det inte. 🙂
Faktum är att hexborg är anledningen till att utdatatexten citeras i början och slutet av varje rad med detta alternativ:
ls –katalog | sed 's/^/»/' | sed 's/$/»/'
Jag förtydligar att find kan användas för att söka i underkatalogerna.
Men med mitt knep är det inte nödvändigt. ls matar ut de fullständiga namnen på filerna ett på varje rad och read läser det rad för rad och lämnar filnamnet i filvariabeln oavsett om den har blanksteg eller inte. Du behöver bara sätta citattecken runt $file när du använder den i kommandot.
Jag håller med om att fyndet kan vara mindre krångligt. Ta det här exemplet från artikeln:
ls --directory “$@” | sed 's/^/"/' | sed 's/$/"/' | awk '{print "pdftotext",$0}' | sh
Samma sak kan mycket väl uppnås så här och går förmodligen snabbare:
find . -type f -print0 | xargs -0 pdftotext
Som sagt, artikeln är välkommen, det är alltid bra att veta alternativa sätt att göra något på.
Om du märker att $i står inom citattecken. Det gör det onödigt att undkomma blanksteg.
Ja, men operatorn $() expanderar filnamnen utan att sätta citattecken någonstans, så variabeln i får redan namnen på de klippta filerna. Prova det i en terminal i en katalog som har filer med mellanslag i namnen.
Mycket bra, komplex, men mycket intressant.
det här är fantastiskt, fantastiskt!!!!
Utmärkt, plasticiteten hos GNU/Linux har inga gränser.
Kära bloggare
Jag heter Natalia, kommunikationschef på Paperblog. Efter att ha upptäckt det kontaktar jag dig för att bjuda in dig att upptäcka Paperblog-projektet, http://es.paperblog.com, en ny tjänst för medborgarjournalistik. Paperblog är en digital plattform som som bloggtidning publicerar de bästa artiklarna från registrerade bloggar.
Om konceptet intresserar dig behöver du bara föreslå din blogg för att delta. Artiklarna skulle åtföljas av ditt namn/pseudonym och din profilfil, samt flera länkar till den ursprungliga bloggen, i början och slutet av varje. De mest intressanta kan väljas ut av teamet för att visas på förstasidan och du kan bli utvald som dagens författare.
Jag hoppas att du är motiverad av projektet som vi startade med sådan entusiasm i januari 2010. Ta en titt och tveka inte att skriva till mig för mer information.
Ta emot en hjärtlig och tillgiven hälsning,
natalia