Hur man använder kommandon som bara fungerar med en fil i taget med alla filer du väljer

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

I det här fallet är det inte nödvändigt att välja en utdatafil eftersom pdftotext automatiskt genererar en textfil med basnamnet och .txt-undantaget om och bara om du arbetar med en enda fil.

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

För att ange numret användes det interna språket awk med alternativet "FNR" som listar varje utdatarad, så numret kan placeras före eller efter texten.

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

Beroende på versionen av zenity kan alternativet för lösenordet endast vara –lösenord.

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

Extra citattecken ska separeras med ett mellanslag där alternativet "$0" används
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.

Det här alternativet kan vara mycket användbart om vi vill konvertera en hel grupp videor med mencoder utan att det förenar dem till en; ett manus kan förberedas för detta och de skulle bara behöva lägga ls --directory %F | sed 's/^/"/' | sed 's/$/"/' | awk '{print "script-convertir-video "$0" "}' | sh && zenity --info --text "Todas las conversiones han terminado"

FIN


15 kommentarer, lämna din

Lämna din kommentar

Din e-postadress kommer inte att publiceras. Obligatoriska fält är markerade med *

*

*

  1. Ansvarig för uppgifterna: Miguel Ángel Gatón
  2. Syftet med uppgifterna: Kontrollera skräppost, kommentarhantering.
  3. Legitimering: Ditt samtycke
  4. Kommunikation av uppgifterna: Uppgifterna kommer inte att kommuniceras till tredje part förutom enligt laglig skyldighet.
  5. Datalagring: databas värd för Occentus Networks (EU)
  6. Rättigheter: När som helst kan du begränsa, återställa och radera din information.

  1.   Ramiro sade

    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.

  2.   crotus sade

    Sanningen är att du har stor kunskap om linux-kommandon. Mycket användbart!

    1.    KZKG ^ Gaara sade

      Ja, jag vet att vi kommer att lära oss mycket med honom här hahaha.

  3.   hexborg sade

    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.

    1.    Ankh sade

      o:
      för i i $(ls -d /sökväg/till/mapp/*.ext); KOMMANDO "$i"; donera;

      1.    hexborg sade

        Det låter bra, men om filnamnen innehåller blanksteg fungerar det inte. 🙂

        1.    tahed sade

          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.

          1.    hexborg sade

            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.

          2.    Hugo sade

            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å.

        2.    Ankh sade

          Om du märker att $i står inom citattecken. Det gör det onödigt att undkomma blanksteg.

          1.    hexborg sade

            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.

  4.   Leo sade

    Mycket bra, komplex, men mycket intressant.

  5.   helena_ryuu sade

    det här är fantastiskt, fantastiskt!!!!

  6.   MSX sade

    Utmärkt, plasticiteten hos GNU/Linux har inga gränser.

  7.   natalia sade

    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