วิธีใช้คำสั่งที่ใช้ได้ทีละไฟล์กับไฟล์ทั้งหมดที่คุณเลือก

หลายครั้งเราจำเป็นต้องเรียกใช้สคริปต์เพื่อแปลง pdf เป็นข้อความแปลงไฟล์. doc เป็น html เป็นต้น ประเด็นก็คือคำสั่งเหล่านี้ยอมรับทีละไฟล์เท่านั้นและเป็นเรื่องที่น่าเบื่อมากหากเราต้องทำงานเดียวกันกับไฟล์หลาย ๆ ไฟล์โดยเฉพาะอย่างยิ่งเมื่อเราทำสคริปต์

ฉันเสนอวิธีแก้ปัญหานี้โดยใช้ ls, ความกระหายน้ำ, grep, awk y sh. สิ่งที่เราจะทำคือสร้างบรรทัดคำสั่งที่ถูกต้องในแต่ละแถวและดำเนินการด้วย sh และเนื่องจาก sh จะดำเนินการทีละบรรทัดการใช้หน่วยความจำ ram จะไม่เพิ่มขึ้นซึ่งด้วยวิธีการอื่น ๆ ก็สามารถหยุดเครื่องจักรที่ด้อยอำนาจ

มาดูวิธีดำเนินการตามลำดับคำสั่งนี้

1- สิ่งแรกที่เราต้องทำคือแนะนำไฟล์ที่จะใช้ผ่าน ls:

ls --directory /camino/a/carpeta/*.ext

2- จากนั้นเราจะต้องใช้ไฟล์เหล่านี้เพื่อส่งผ่านคำพูด«/ path / ไปยังกลุ่มของ
ไฟล์«

ls --directory /camino/a/carpeta/*.ext | sed 's/^/"/' | sed 's/$/"/'

3- ตอนนี้ awk มันจะพร้อมรับข้อมูล

ls --directory /camino/a/carpeta/*.ext | sed 's/^/"/' | sed 's/$/"/' | awk '{print $0}'

เพราะ awk มีภาษาของตัวเองเราจะต้องแยกคำพูดที่เราต้องการให้ปรากฏเพื่ออ้างข้อความจากฟังก์ชันอื่น ๆ เราจะต้องใช้แบ็กสแลช \ มาดูวิธีแยกกันบ้าง
แยกคำพูด

\”

แสดงแบ็กสแลชในเอาต์พุต (เราจะต้องพิมพ์สามแถบ)

\\\

บางครั้งเราจะต้องใช้ตัวคั่นแยกเฉพาะข้อความหรือเครื่องหมายคำพูดที่ปรากฏภายในแบ็กสแลชสองตัวเท่านั้นที่จะถูกส่งออกในผลลัพธ์:

'""'\"\'""'

4- มาดูวิธีเปลี่ยนชื่อไฟล์ทั้งหมดที่อยู่ในรายการโดยใช้คำสั่ง mv เพียงเพื่อป้อนคำต่อท้าย (ในการแสดงรายการไฟล์เราจะต้องใช้ชุดค่าผสม "$ 0" เมื่อใดก็ตามที่เราต้องการใช้)

ls --directory /camino/a/carpeta/*.ext | sed 's/^/"/' | sed 's/$/"/' | awk '{print "mv "$0" \"`dirname

"$ 0″" / Text-any-`basename "$ 0″" \ ""} '| ช

หมายเหตุจะถูกเพิ่มในตอนท้ายตามที่แสดงในลำดับก่อนหน้าซึ่งเป็นการรวมกัน« | ช »ซึ่งเปลี่ยนเส้นทางไปป์ไลน์ไปยังตัวแปลคำสั่งนี้

มาดูตัวอย่างที่เตรียมสร้างสคริปต์กัน

Ejemplos:

1- แปลงไฟล์ PDF ทั้งหมดที่แสดงเป็นไฟล์ข้อความ

ls --directory “$@” | sed 's/^/"/' | sed 's/$/"/' | awk '{print "pdftotext",$0}' | sh

ในกรณีนี้ไม่จำเป็นต้องเลือกไฟล์เอาต์พุตเนื่องจาก pdftotext จะสร้างไฟล์ข้อความโดยอัตโนมัติด้วยชื่อฐานและข้อยกเว้น. txt ในกรณีที่คุณกำลังทำงานกับไฟล์เดียวเท่านั้น

2- สมมติว่าเราต้องการใช้เอฟเฟกต์กับรูปภาพ แต่ไม่ต้องแก้ไขต้นฉบับลองดูตัวอย่างเอฟเฟกต์คลื่นที่รู้จักกันดีสำหรับโลโก้ Windows XP เนื่องจากเป็นแฟล็กที่มีเอฟเฟกต์หยัก (เพื่อให้ชื่นชมเอฟเฟกต์นี้ได้ดีขึ้นก็คือ แนะนำให้ใช้เป็นภาพผลลัพธ์ที่มีนามสกุล. 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

หมายเหตุ: มีการทำหลายรอบตามลำดับนี้:

  • หนึ่งในการรับโฟลเดอร์ที่ไฟล์อยู่ด้วย dirname
  • อื่นเพื่อรับชื่อฐาน แต่ลบนามสกุลของไฟล์ดังกล่าว
  • อีกประการหนึ่งเพื่อขอรับการยกเว้นไฟล์ดังกล่าว

3- ตอนนี้เรามาดูวิธีเปลี่ยนชื่อกลุ่มไฟล์โดยใส่หมายเลขที่เกี่ยวข้องไว้ข้างหน้าชื่อ (คำต่อท้ายตัวเลข)

ls --directory “$@” | sed 's/^/"/' | sed 's/$/"/' | awk '{print FS="mv "$0" '""'\"\'""'`dirname
"$0"`/"FNR"-`basename "$0"`'""'\"\'""' "}' | sh

ในการป้อนตัวเลขภาษา awk ภายในถูกใช้กับตัวเลือก "FNR" ที่แสดงรายการเอาต์พุตแต่ละบรรทัดดังนั้นจึงสามารถวางหมายเลขไว้ก่อนหรือหลังข้อความได้

มาดูวิธีใส่ตัวเลขนำหน้า (ใส่ตัวเลขต่อท้าย แต่ก่อนการยกเว้น) ตัวเลือกนี้ใช้ได้เฉพาะเมื่อไฟล์มีนามสกุล.

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- มาดูตัวอย่างที่เราจะต้องป้อนข้อมูลหรือเลือกกลุ่มของฟังก์ชันโดยยกตัวอย่างกรณีที่เราลบการป้องกันด้วยรหัสผ่านออกจากไฟล์ pdf หลายไฟล์ที่มีรหัสผ่านเดียวกัน (ในกรณีนี้เราจะใช้ zenity เป็นกล่องโต้ตอบ)

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

ขึ้นอยู่กับรุ่นของ zenity ตัวเลือกสำหรับรหัสผ่านอาจเป็นแค่ –pasword

อย่างที่คุณเห็นวัตถุประสงค์คือการสร้าง cat ของไฟล์ที่จะสร้างขึ้นที่จุดเริ่มต้นของบรรทัดเพียงครั้งเดียวจากนั้นไฟล์จะถูกตัดออกเมื่อการแปลงเสร็จสมบูรณ์

5- ยูทิลิตี้อื่นคือเมื่อเราต้องการคลายซิปไฟล์หลายไฟล์ที่บีบอัดเป็น. zip

ls --directory “$@” | sed 's/^/"/' | sed 's/$/"/' | awk '{print "unzip -x "$0" "}' | sh

เครื่องหมายคำพูดพิเศษต้องคั่นด้วยช่องว่างที่ใช้ตัวเลือก "$ 0"
ตัวอย่าง
"unzip -x "$0" "

6- มาดูตัวอย่างการป้องกัน pdf ด้วยรหัสผ่านซึ่งอนุญาตให้อ่านได้ แต่ป้องกันจากการพิมพ์สำเนาหรือตัวเลือกอื่น ๆ (ตัวเลือกที่แสดงในกล่องโต้ตอบจะเป็นตัวเลือกที่ได้รับอนุญาตใน pdf หากคุณไม่ต้องการอนุญาตใด ๆ ของพวกเขาอย่าเลือกเลย)

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

ด้วยตัวอย่างเหล่านี้เป็นตัวอย่างวิธีการใช้ตัวเลือกนี้ในการแปลงแก้ไขหรือเปลี่ยนชื่อไฟล์หลายไฟล์ด้วยสคริปต์เดียวและไม่แปลงไฟล์ด้วยมือทีละไฟล์ การใช้หน่วยความจำด้วยตัวเลือกนี้มีน้อยมากขึ้นอยู่กับคำสั่งที่ใช้เนื่องจากจะไม่แปลงหน่วยความจำในเวลาเดียวกัน แต่ทำทีละคำสั่ง

ตัวเลือกนี้จะมีประโยชน์มากหากเราต้องการแปลงวิดีโอทั้งกลุ่มด้วย mencoder โดยไม่ต้องรวมวิดีโอนี้เข้าด้วยกัน คุณสามารถเตรียมสคริปต์สำหรับสิ่งนี้และพวกเขาก็ต้องใส่ ls --directory %F | sed 's/^/"/' | sed 's/$/"/' | awk '{print "script-convertir-video "$0" "}' | sh && zenity --info --text "Todas las conversiones han terminado"

ครีบ


แสดงความคิดเห็นของคุณ

อีเมล์ของคุณจะไม่ถูกเผยแพร่ ช่องที่ต้องการถูกทำเครื่องหมายด้วย *

*

*

  1. ผู้รับผิดชอบข้อมูล: Miguel ÁngelGatón
  2. วัตถุประสงค์ของข้อมูล: ควบคุมสแปมการจัดการความคิดเห็น
  3. ถูกต้องตามกฎหมาย: ความยินยอมของคุณ
  4. การสื่อสารข้อมูล: ข้อมูลจะไม่ถูกสื่อสารไปยังบุคคลที่สามยกเว้นตามข้อผูกพันทางกฎหมาย
  5. การจัดเก็บข้อมูล: ฐานข้อมูลที่โฮสต์โดย Occentus Networks (EU)
  6. สิทธิ์: คุณสามารถ จำกัด กู้คืนและลบข้อมูลของคุณได้ตลอดเวลา

  1.   Ramiro dijo

    มันจะไม่มาก แต่ง่ายกว่ามากที่จะทำทั้งหมดนี้โดยใช้นิพจน์ทั่วไปหรืออักขระตัวแทน? ฉันไม่เข้าใจว่าความแตกต่างระหว่างสิ่งนั้นคืออะไรกับการทำให้ชีวิตคุณซับซ้อนขนาดนี้

  2.   Croto dijo

    ความจริงคุณมีความรู้ดีเกี่ยวกับคำสั่ง linux มีประโยชน์มาก!

    1.    KZKG ^ กาอาระ dijo

      ใช่ฉันรู้ว่าเราจะได้เรียนรู้มากมายกับเขาที่นี่ฮ่า ๆ ๆ

  3.   ฐานสิบหก dijo

    ฉันคิดว่ามันง่ายกว่ามาก:

    ls -d /path/to/folder/*.ext | ขณะอ่านไฟล์ ทำ COMMAND "$ file"; เสร็จแล้ว

    แทนที่จะเป็นคำสั่งคุณสามารถใส่อะไรก็ได้ที่คุณต้องการและใช้งานได้แม้ว่าไฟล์จะมีช่องว่างตราบใดที่คุณใส่ $ file ไว้ระหว่างเครื่องหมายคำพูด คุณไม่จำเป็นต้องใช้ sed สำหรับสิ่งนั้นหรือสร้างคำสั่งด้วย awk นอกจากนี้ยังเปิดตัวกระบวนการน้อยลง

    1.    อังก์ dijo

      o:
      สำหรับฉันใน $ (ls -d /path/a/folder/*.ext); ทำคำสั่ง“ $ i”; เสร็จแล้ว;

      1.    ฐานสิบหก dijo

        ดูดี แต่ถ้าชื่อไฟล์มีช่องว่างจะไม่ทำงาน 🙂

        1.    ทาเฮด dijo

          ในความเป็นจริง hexborg เป็นสาเหตุที่ข้อความเอาต์พุตถูกยกมาที่จุดเริ่มต้นและตอนท้ายสำหรับแต่ละบรรทัดด้วยตัวเลือกนี้:
          ls –directory | sed 's / ^ / » /' | sed 's / $ / » /'

          ฉันชี้แจงว่า find สามารถใช้เพื่อค้นหาไดเร็กทอรีย่อยได้

          1.    ฐานสิบหก dijo

            แต่ด้วยเคล็ดลับของฉันคุณไม่จำเป็นต้องทำ ls นำชื่อไฟล์แบบเต็มออกมาหนึ่งชื่อในแต่ละบรรทัดและอ่านอ่านทีละบรรทัดและปล่อยชื่อไฟล์ไว้ในตัวแปรไฟล์ไม่ว่าจะมีช่องว่างหรือไม่ก็ตาม คุณต้องใส่เครื่องหมายคำพูดรอบ ๆ ไฟล์ $ เมื่อใช้ในคำสั่ง

          2.    ฮิวโก้ dijo

            ฉันยอมรับว่าอาจจะยุ่งยากน้อยลง ลองดูตัวอย่างจากบทความนี้:

            ls --directory “$@” | sed 's/^/"/' | sed 's/$/"/' | awk '{print "pdftotext",$0}' | sh

            สิ่งเดียวกันสามารถทำได้เช่นนี้และอาจทำงานได้เร็วขึ้น:

            find . -type f -print0 | xargs -0 pdftotext

            ที่กล่าวว่ายินดีต้อนรับบทความนี้เป็นเรื่องดีที่จะเรียนรู้เกี่ยวกับวิธีอื่นในการทำบางสิ่ง

        2.    อังก์ dijo

          หากคุณสังเกตเห็น $ i อยู่ในเครื่องหมายคำพูด นั่นทำให้การเว้นช่องว่างไม่จำเป็น

          1.    ฐานสิบหก dijo

            ใช่ แต่ตัวดำเนินการ $ () ขยายชื่อไฟล์โดยไม่ใส่เครื่องหมายคำพูดที่ใดก็ได้ดังนั้นตัวแปรฉันจึงจับชื่อของไฟล์ที่ถูกตัดไว้แล้ว ลองใช้ในเทอร์มินัลในไดเร็กทอรีที่มีไฟล์ที่มีช่องว่างในชื่อ

  4.   ราศีสิงห์ dijo

    ดีมากซับซ้อน แต่น่าสนใจมาก

  5.   เฮเลน่า_ริว dijo

    นี่มันสุดยอดมาก !!!!

  6.   MSX dijo

    ยอดเยี่ยมความเป็นพลาสติกของ GNU / Linux ไม่มีข้อ จำกัด

  7.   Natalia dijo

    เรียนบล็อกเกอร์

    ฉันชื่อ Natalia ผู้จัดการฝ่ายสื่อสารของ Paperblog หลังจากค้นพบแล้วฉันกำลังติดต่อคุณเพื่อเชิญคุณให้รู้จักโครงการ Paperblog http://es.paperblog.comบริการสื่อสารมวลชนใหม่ของพลเมือง Paperblog เป็นแพลตฟอร์มดิจิทัลที่เผยแพร่บทความที่ดีที่สุดของบล็อกที่ลงทะเบียนเช่นเดียวกับนิตยสารบล็อก

    หากแนวคิดที่คุณสนใจคุณจะต้องเสนอบล็อกของคุณเพื่อเข้าร่วมเท่านั้น บทความจะมาพร้อมกับชื่อ / นามแฝงและไฟล์โปรไฟล์ของคุณนอกเหนือจากลิงก์หลาย ๆ ลิงก์ไปยังบล็อกดั้งเดิมที่จุดเริ่มต้นและจุดสิ้นสุดของแต่ละบทความ ทีมงานสามารถเลือกสิ่งที่น่าสนใจที่สุดให้ปรากฏบนหน้าปกและคุณสามารถเลือกเป็นผู้แต่งประจำวันได้

    ฉันหวังว่าคุณจะได้รับแรงบันดาลใจจากโครงการที่เราเริ่มต้นด้วยความกระตือรือร้นเช่นนี้ในเดือนมกราคม 2010 ลองดูและอย่าลังเลที่จะเขียนถึงฉันสำหรับรายละเอียดเพิ่มเติม

    รับคำอวยพรที่จริงใจและรักใคร่
    Natalia