如何使用一次只能對一個文件使用的命令以及您選擇的所有文件

很多時候,我們需要運行腳本以將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

在這種情況下,沒有必要選擇輸出文件,因為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

注意:按此順序進行了多次傳遞:

  • 一種獲取帶有目錄名的文件所在的文件夾
  • 另一個獲取基本名稱,但刪除所述文件的擴展名
  • 另一個獲得所述文件的豁免。

3- 現在,讓我們看看如何通過在名稱(數字後綴)前面放置相應的數字來重命名一組文件。

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

要輸入數字,內部awk語言與選項“ FNR”一起使用,該選項列出了輸出的每一行,因此可以將數字放在文本之前或之後。

讓我們看看如何放置一個數字前綴(在數字的末尾,但在免除項之前),該選項僅在文件中帶有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

根據zenity的版本,密碼選項可以僅為–pasword。

如您所見,目標是創建一個只在行首創建一次的文件,然後在轉換完成後將其刪除。

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"

END


15條評論,留下您的評論

發表您的評論

您的電子郵件地址將不會被發表。 必填字段標有 *

*

*

  1. 負責數據:MiguelÁngelGatón
  2. 數據用途:控制垃圾郵件,註釋管理。
  3. 合法性:您的同意
  4. 數據通訊:除非有法律義務,否則不會將數據傳達給第三方。
  5. 數據存儲:Occentus Networks(EU)託管的數據庫
  6. 權利:您可以隨時限制,恢復和刪除您的信息。

  1.   拉米羅 他說:

    不會很多嗎,但是使用正則表達式或通配符更容易完成所有這些操作嗎? 我不明白這與讓您的生活變得如此復雜之間有什麼區別。

  2.   克羅托 他說:

    真相大白,您對linux命令有很深的了解。 很有用!

    1.    KZKG ^ Gaara 他說:

      是的,我知道我們將在這裡與他一起學習很多東西哈哈哈。

  3.   赫格堡 他說:

    我認為這要容易得多:

    ls -d /path/to/folder/*.ext | 在讀取文件時; 做COMMAND“ $文件”; 完成

    可以使用您想要的任何內容代替COMMAND,即使文件包含空格也可以,只要您將$ file放在引號之間即可。 您不需要為此使用sed或使用awk生成命令。 同樣,這會啟動更少的進程。

    1.    安克 他說:

      o:
      對於$中的i(ls -d /path/to/folder/*.ext); 命令“ $ i”; 完成

      1.    赫格堡 他說:

        看起來不錯,但是如果文件名包含空格,則無法使用。 🙂

        1.    塔希德 他說:

          實際上,hexborg是使用此選項在每行的開頭和結尾都引用輸出文本的原因:
          ls –目錄| sed的/ ^ /»/'| sed's / $ /»/'

          我澄清說find可以用來搜索子目錄。

          1.    赫格堡 他說:

            但是,借助我的技巧,您不必這樣做。 ls每行取一個文件的全名,並逐行讀取,並將文件名保留在file變量中,無論是否有空格。 在命令中使用$時,只需要在$ file周圍加上引號即可。

          2.    雨果 他說:

            我同意,這樣做可以減少麻煩。 讓我們從文章中看這個例子:

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

            可以像這樣實現相同的目標,並且運行速度可能更快:

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

            話雖這麼說,但這篇文章還是值得歡迎的,學習做事的替代方式總是一件好事。

        2.    安克 他說:

          如果您注意到$ i用引號引起來。 這使得轉義空白變得不必要。

          1.    赫格堡 他說:

            是的,但是$()運算符可擴展文件名而不在任何地方加引號,因此變量i已經捕獲了剪切文件的名稱。 在目錄中包含名稱中帶有空格的文件的終端中嘗試。

  4.   獅子座 他說:

    很好,很複雜,但是很有趣。

  5.   海倫娜_ryuu 他說:

    這太神奇了,太棒了!

  6.   MSX 他說:

    出色,GNU / Linux的可塑性沒有限制。

  7.   納塔利婭 他說:

    親愛的博客,

    我是Paperblog的通訊經理Natalia。 發現它之後,我會與您聯繫,邀請您了解Paperblog項目, http://es.paperblog.com,一項新的公民新聞服務。 Paperblog是一個數字平台,像博客雜誌一樣,發布已註冊博客的最佳文章。

    如果您對這個概念感興趣,則只需提出博客即可參與。 這些文章將在每個文章的開頭和結尾隨附您的姓名/化名和個人資料文件,以及指向原始博客的幾個鏈接。 團隊可以選擇最有趣的內容,以顯示在“首頁”上,您也可以被選為當天的作者。

    希望您對我們從2010年XNUMX月開始如此熱情的項目感到振奮。看看吧,不要猶豫,給我寫信以獲取更多詳細信息。

    收到親切而親切的問候,
    納塔利婭