很多時候,我們需要運行腳本以將pdf轉換為文本,將.doc文件轉換為html等。 關鍵是這些命令一次只接受一個文件,如果我們需要對多個文件執行相同的任務,特別是在編寫腳本時,這對於我們來說是非常繁瑣的。
我建議使用以下方法解決此問題 ls, 口渴, grep的, AWK y sh。 我們要做的是在每行中創建正確的命令行並用sh執行它們,由於sh一次只能執行一行,因此ram內存的使用不會增加,而其他方法甚至可以凍結性能低下的計算機。
讓我們看看如何執行此命令序列。
1- 我們要做的第一件事是介紹將通過以下方式使用的文件 ls:
ls --directory /camino/a/carpeta/*.ext
2- 然後,我們將需要這些文件傳遞引號«/路徑/到組
檔案«
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”“ /任意文本基名稱” $ 0“” \“”}'| SH
如前面的序列所示,在末尾添加了組合« | SH »哪個將管道重定向到此命令解釋器
讓我們來看一些準備創建腳本的示例。
範例:
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
注意:按此順序進行了多次傳遞:
- 一種獲取帶有目錄名的文件所在的文件夾
- 另一個獲取基本名稱,但刪除所述文件的擴展名
- 另一個獲得所述文件的豁免。
3- 現在,讓我們看看如何通過在名稱(數字後綴)前面放置相應的數字來重命名一組文件。
ls --directory “$@” | sed 's/^/"/' | sed 's/$/"/' | awk '{print FS="mv "$0" '""'\"\'""'`dirname
"$0"`/"FNR"-`basename "$0"`'""'\"\'""' "}' | sh
讓我們看看如何放置一個數字前綴(在數字的末尾,但在免除項之前),該選項僅在文件中帶有a時有效。
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
如您所見,目標是創建一個只在行首創建一次的文件,然後在轉換完成後將其刪除。
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"
END
不會很多嗎,但是使用正則表達式或通配符更容易完成所有這些操作嗎? 我不明白這與讓您的生活變得如此復雜之間有什麼區別。
真相大白,您對linux命令有很深的了解。 很有用!
是的,我知道我們將在這裡與他一起學習很多東西哈哈哈。
我認為這要容易得多:
ls -d /path/to/folder/*.ext | 在讀取文件時; 做COMMAND“ $文件”; 完成
可以使用您想要的任何內容代替COMMAND,即使文件包含空格也可以,只要您將$ file放在引號之間即可。 您不需要為此使用sed或使用awk生成命令。 同樣,這會啟動更少的進程。
o:
對於$中的i(ls -d /path/to/folder/*.ext); 命令“ $ i”; 完成
看起來不錯,但是如果文件名包含空格,則無法使用。 🙂
實際上,hexborg是使用此選項在每行的開頭和結尾都引用輸出文本的原因:
ls –目錄| sed的/ ^ /»/'| sed's / $ /»/'
我澄清說find可以用來搜索子目錄。
但是,借助我的技巧,您不必這樣做。 ls每行取一個文件的全名,並逐行讀取,並將文件名保留在file變量中,無論是否有空格。 在命令中使用$時,只需要在$ file周圍加上引號即可。
我同意,這樣做可以減少麻煩。 讓我們從文章中看這個例子:
ls --directory “$@” | sed 's/^/"/' | sed 's/$/"/' | awk '{print "pdftotext",$0}' | sh
可以像這樣實現相同的目標,並且運行速度可能更快:
find . -type f -print0 | xargs -0 pdftotext
話雖這麼說,但這篇文章還是值得歡迎的,學習做事的替代方式總是一件好事。
如果您注意到$ i用引號引起來。 這使得轉義空白變得不必要。
是的,但是$()運算符可擴展文件名而不在任何地方加引號,因此變量i已經捕獲了剪切文件的名稱。 在目錄中包含名稱中帶有空格的文件的終端中嘗試。
很好,很複雜,但是很有趣。
這太神奇了,太棒了!
出色,GNU / Linux的可塑性沒有限制。
親愛的博客,
我是Paperblog的通訊經理Natalia。 發現它之後,我會與您聯繫,邀請您了解Paperblog項目, http://es.paperblog.com,一項新的公民新聞服務。 Paperblog是一個數字平台,像博客雜誌一樣,發布已註冊博客的最佳文章。
如果您對這個概念感興趣,則只需提出博客即可參與。 這些文章將在每個文章的開頭和結尾隨附您的姓名/化名和個人資料文件,以及指向原始博客的幾個鏈接。 團隊可以選擇最有趣的內容,以顯示在“首頁”上,您也可以被選為當天的作者。
希望您對我們從2010年XNUMX月開始如此熱情的項目感到振奮。看看吧,不要猶豫,給我寫信以獲取更多詳細信息。
收到親切而親切的問候,
納塔利婭