如何使用一次只能对一个文件使用的命令以及您选择的所有文件

很多时候,我们需要运行脚本以将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 »哪个将管道重定向到此命令解释器

让我们来看一些准备创建脚本的示例。

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

注意:按此顺序进行了几次遍历:

  • 一种获取带有目录名的文件所在的文件夹
  • 另一个获取基本名称,但删除所述文件的扩展名
  • 另一个获得所述文件的豁免。

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


发表您的评论

您的电子邮件地址将不会被发表。 必填字段标有 *

*

*

  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/a/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.   Natalia

    亲爱的博客,

    我是Paperblog的通讯经理Natalia。 发现它之后,我会与您联系以邀请您了解Paperblog项目, http://es.paperblog.com,一项新的公民新闻服务。 Paperblog是一个数字平台,类似于博客杂志,它会发布已注册博客的最佳文章。

    如果您对这个概念感兴趣,则只需提出博客即可参与。 这些文章将在每个文章的开头和结尾随附您的姓名/化名和个人资料文件,以及指向原始博客的几个链接。 团队可以选择最有趣的内容,以显示在封面上,您也可以被选为当天的作者。

    希望您对我们从2010年XNUMX月开始如此热情的项目感到振奋。看看,不要犹豫,写信给我了解更多细节。

    收到亲切而亲切的问候,
    Natalia