หลายครั้งเราจำเป็นต้องเรียกใช้สคริปต์เพื่อแปลง 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
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
มาดูวิธีใส่ตัวเลขนำหน้า (ใส่ตัวเลขต่อท้าย แต่ก่อนการยกเว้น) ตัวเลือกนี้ใช้ได้เฉพาะเมื่อไฟล์มีนามสกุล.
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
อย่างที่คุณเห็นวัตถุประสงค์คือการสร้าง cat ของไฟล์ที่จะสร้างขึ้นที่จุดเริ่มต้นของบรรทัดเพียงครั้งเดียวจากนั้นไฟล์จะถูกตัดออกเมื่อการแปลงเสร็จสมบูรณ์
5- ยูทิลิตี้อื่นคือเมื่อเราต้องการคลายซิปไฟล์หลายไฟล์ที่บีบอัดเป็น. zip
ls --directory “$@” | sed 's/^/"/' | sed 's/$/"/' | awk '{print "unzip -x "$0" "}' | sh
ตัวอย่าง
"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
ด้วยตัวอย่างเหล่านี้เป็นตัวอย่างวิธีการใช้ตัวเลือกนี้ในการแปลงแก้ไขหรือเปลี่ยนชื่อไฟล์หลายไฟล์ด้วยสคริปต์เดียวและไม่แปลงไฟล์ด้วยมือทีละไฟล์ การใช้หน่วยความจำด้วยตัวเลือกนี้มีน้อยมากขึ้นอยู่กับคำสั่งที่ใช้เนื่องจากจะไม่แปลงหน่วยความจำในเวลาเดียวกัน แต่ทำทีละคำสั่ง
ls --directory %F | sed 's/^/"/' | sed 's/$/"/' | awk '{print "script-convertir-video "$0" "}' | sh && zenity --info --text "Todas las conversiones han terminado"
ครีบ
มันจะไม่มาก แต่ง่ายกว่ามากที่จะทำทั้งหมดนี้โดยใช้นิพจน์ทั่วไปหรืออักขระตัวแทน? ฉันไม่เข้าใจว่าความแตกต่างระหว่างสิ่งนั้นคืออะไรกับการทำให้ชีวิตคุณซับซ้อนขนาดนี้
ความจริงคุณมีความรู้ดีเกี่ยวกับคำสั่ง linux มีประโยชน์มาก!
ใช่ฉันรู้ว่าเราจะได้เรียนรู้มากมายกับเขาที่นี่ฮ่า ๆ ๆ
ฉันคิดว่ามันง่ายกว่ามาก:
ls -d /path/to/folder/*.ext | ขณะอ่านไฟล์ ทำ COMMAND "$ file"; เสร็จแล้ว
แทนที่จะเป็นคำสั่งคุณสามารถใส่อะไรก็ได้ที่คุณต้องการและใช้งานได้แม้ว่าไฟล์จะมีช่องว่างตราบใดที่คุณใส่ $ file ไว้ระหว่างเครื่องหมายคำพูด คุณไม่จำเป็นต้องใช้ sed สำหรับสิ่งนั้นหรือสร้างคำสั่งด้วย awk นอกจากนี้ยังเปิดตัวกระบวนการน้อยลง
o:
สำหรับฉันใน $ (ls -d /path/a/folder/*.ext); ทำคำสั่ง“ $ i”; เสร็จแล้ว;
ดูดี แต่ถ้าชื่อไฟล์มีช่องว่างจะไม่ทำงาน 🙂
ในความเป็นจริง hexborg เป็นสาเหตุที่ข้อความเอาต์พุตถูกยกมาที่จุดเริ่มต้นและตอนท้ายสำหรับแต่ละบรรทัดด้วยตัวเลือกนี้:
ls –directory | sed 's / ^ / » /' | sed 's / $ / » /'
ฉันชี้แจงว่า find สามารถใช้เพื่อค้นหาไดเร็กทอรีย่อยได้
แต่ด้วยเคล็ดลับของฉันคุณไม่จำเป็นต้องทำ ls นำชื่อไฟล์แบบเต็มออกมาหนึ่งชื่อในแต่ละบรรทัดและอ่านอ่านทีละบรรทัดและปล่อยชื่อไฟล์ไว้ในตัวแปรไฟล์ไม่ว่าจะมีช่องว่างหรือไม่ก็ตาม คุณต้องใส่เครื่องหมายคำพูดรอบ ๆ ไฟล์ $ เมื่อใช้ในคำสั่ง
ฉันยอมรับว่าอาจจะยุ่งยากน้อยลง ลองดูตัวอย่างจากบทความนี้:
ls --directory “$@” | sed 's/^/"/' | sed 's/$/"/' | awk '{print "pdftotext",$0}' | sh
สิ่งเดียวกันสามารถทำได้เช่นนี้และอาจทำงานได้เร็วขึ้น:
find . -type f -print0 | xargs -0 pdftotext
ที่กล่าวว่ายินดีต้อนรับบทความนี้เป็นเรื่องดีที่จะเรียนรู้เกี่ยวกับวิธีอื่นในการทำบางสิ่ง
หากคุณสังเกตเห็น $ i อยู่ในเครื่องหมายคำพูด นั่นทำให้การเว้นช่องว่างไม่จำเป็น
ใช่ แต่ตัวดำเนินการ $ () ขยายชื่อไฟล์โดยไม่ใส่เครื่องหมายคำพูดที่ใดก็ได้ดังนั้นตัวแปรฉันจึงจับชื่อของไฟล์ที่ถูกตัดไว้แล้ว ลองใช้ในเทอร์มินัลในไดเร็กทอรีที่มีไฟล์ที่มีช่องว่างในชื่อ
ดีมากซับซ้อน แต่น่าสนใจมาก
นี่มันสุดยอดมาก !!!!
ยอดเยี่ยมความเป็นพลาสติกของ GNU / Linux ไม่มีข้อ จำกัด
เรียนบล็อกเกอร์
ฉันชื่อ Natalia ผู้จัดการฝ่ายสื่อสารของ Paperblog หลังจากค้นพบแล้วฉันกำลังติดต่อคุณเพื่อเชิญคุณให้รู้จักโครงการ Paperblog http://es.paperblog.comบริการสื่อสารมวลชนใหม่ของพลเมือง Paperblog เป็นแพลตฟอร์มดิจิทัลที่เผยแพร่บทความที่ดีที่สุดของบล็อกที่ลงทะเบียนเช่นเดียวกับนิตยสารบล็อก
หากแนวคิดที่คุณสนใจคุณจะต้องเสนอบล็อกของคุณเพื่อเข้าร่วมเท่านั้น บทความจะมาพร้อมกับชื่อ / นามแฝงและไฟล์โปรไฟล์ของคุณนอกเหนือจากลิงก์หลาย ๆ ลิงก์ไปยังบล็อกดั้งเดิมที่จุดเริ่มต้นและจุดสิ้นสุดของแต่ละบทความ ทีมงานสามารถเลือกสิ่งที่น่าสนใจที่สุดให้ปรากฏบนหน้าปกและคุณสามารถเลือกเป็นผู้แต่งประจำวันได้
ฉันหวังว่าคุณจะได้รับแรงบันดาลใจจากโครงการที่เราเริ่มต้นด้วยความกระตือรือร้นเช่นนี้ในเดือนมกราคม 2010 ลองดูและอย่าลังเลที่จะเขียนถึงฉันสำหรับรายละเอียดเพิ่มเติม
รับคำอวยพรที่จริงใจและรักใคร่
Natalia