很多时候,我们需要运行脚本以将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
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/a/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月开始如此热情的项目感到振奋。看看,不要犹豫,写信给我了解更多细节。
收到亲切而亲切的问候,
Natalia