【发布时间】:2020-05-08 14:50:17
【问题描述】:
编辑
在以下答案之间,chepner's 和 Walter_A's 解决了问题。很快,要从 find 命令中打印单引号,您
(1) 使用 "\047" 代替单引号或
(2) 定义一个局部变量,例如q="'" 在 find 命令之前并使用 $q 代替单引号。
因此,解决这个特定问题的方法不是使用 printf 代替 echo 或使用 for 循环代替 find...exec,但 printf 和 for 都可能有助于改进代码。
原始问题:
我正在尝试自动化以下过程:
在当前目录中查找特定文件;
为每个文件名在文本文件中附加一行,其中文件名以字符串“file”开头并用单引号括起来。
这实际上是任务的简化版本:我搜索的文件是视频文件,ffmpeg 在尝试将它们的名称写入文本文件之前对其进行了一些处理。文本文件的目的是稍后连接输出文件。整行是这样的:
find . -maxdepth 1 -iname "name*" -exec sh -c 'ffmpeg -i "$0" -ss 3.3 -c:v libx264 -crf 20 -pix_fmt yuv420p -c:a copy "out/""$0"; echo "file ""\'""$(basename -- "$0")">>mylist.txt' {} \;
但是,视频部分效果很好,我只专注于单引号的打印(在屏幕上或文件中),这给我带来了麻烦。如果我试试这个:
find . -iname "*" -exec sh -c 'echo "file ""$0"' {} \;
我得到了,正如预期的那样:
file a1.mp4
file a2.mp4
[...]
我现在在文件名 $0; 前添加一个单引号;在双引号或单引号之间,是否转义(如果转义,我也尝试过不带引号),在美元符号后的引号之间,但我得到的只是符号“>”,后跟一个闪烁的光标,等待更多输入。
我尝试将单引号插入为:"\'", '\'', \', $''', $'\'', $"\'"; 我把它放在字符串“file”中,有或没有单引号或双引号;我在 exec 中设置了一个变量 v="file ""\'""$0" 并在双引号之间回显了 it。不过,我所有的尝试都失败了。理解为什么会很好。也许这里有一些东西要学习...感谢您提供的建议。
______________ 解决方法 _______________
我找到了解决方法。我编写了一个 bash 文件,而不是从终端发出单个命令。在查找行之前,我导出了一个变量 SQ="'"。然后我的查找行变为:
find . -maxdepth 1 -iname "*" -exec sh -c 'echo "file ""$SQ""$(basename -- "$0")""$SQ"' {} \;
而且它有效。也许在导出变量中出现的单引号与在 shell 中的字符串或局部变量中出现的单引号不同?
【问题讨论】:
-
不清楚为什么您的初始
find命令如此复杂。您可以使用find . -exec echo file {} \;获得预期的输出。 -
正如我所写,我删除了一个较长的 ffmpeg 部分,因为它不会影响问题。但问题出现的背景正是如此复杂。 --- 我可以要求解释一下反对票吗?
-
我没有投反对票,所以我猜不出投反对票的人在想什么。但是对于您想要的内容,可能有一个更简单的解决方案,根本不涉及
find。 -
这很好听。无论如何,我已经编辑并添加了完整的原始行
标签: bash shell exec single-quotes