当前位置: 首页 > 面试题库 >

查找和基名不能很好地播放

刘瑞
2023-03-14
问题内容

我想在Linux命令行上回显查找的文件名部分。我尝试使用以下内容:

find www/*.html -type f -exec sh -c "echo $(basename {})" \;

find www/*.html -type f -exec sh -c "echo `basename {}`" \;

以及转义和引用文本各个部分的其他组合。结果是该路径未被剥离:

www/channel.html
www/definition.html
www/empty.html
www/index.html
www/privacypolicy.html

为什么不?

更新:尽管我在下面有一个可行的解决方案,但我仍然对为什么“基本名称”没有执行应做的事情感兴趣。


问题答案:

您最初尝试的麻烦:

find www/*.html -type f -exec sh -c "echo $(basename {})" \;

$(basename {})代码在执行find命令之前执行一次。单曲的输出basename{}因为它是{}文件名的基本名称。因此,由find执行的命令是:

sh -c "echo {}"

为找到的每个文件,但find实际上每次都替换原始的(未修改的)文件名,因为{}字符出现在要执行的字符串中。

如果您希望它起作用,则可以使用单引号而不是双引号:

find www/*.html -type f -exec sh -c 'echo $(basename {})' \;

但是,echo将标准输出重复到标准basename输出无论如何都是没有意义的:

find www/*.html -type f -exec sh -c 'basename {}' \;

当然,我们可以进一步减少到:

find www/*.html -type f -exec basename {} \;

您还能在这里解释单引号和双引号之间的区别吗?

这是常规的shell行为。让我们采取一个略有不同的命令(但仅略微-
文件名可以在www目录下的任何位置,而不仅仅是向下一级),然后查看命令的单引号(SQ)和双引号(DQ)版本。命令:

find www -name '*.html' -type f -exec sh -c "echo $(basename {})" \;   # DQ
find www -name '*.html' -type f -exec sh -c 'echo $(basename {})' \;   # SQ

单引号将直接包含在命令中的材料传递给命令。因此,在SQ命令行中,启动的shell find删除了引号,该find命令将其$9参数视为:

echo $(basename {})

因为外壳会删除引号。相比之下,双引号中的材料由外壳处理。因此,在DQ命令行外壳(即发射find-而不是一个推出
find),看到$(basename {})串并执行它的一部分,取回{},所以它传递到字符串find作为它的$9参数是:

echo {}

现在,什么时候find执行-exec操作,在两种情况下都将其替换为{}刚找到的文件名(出于论证目的www/pics/index.html)。因此,您将执行两个不同的命令:

sh -c 'echo $(basename www/pics/index.html)'    # SQ
sh -c "echo www/pics/index.html"                # DQ

那里有一个(轻微的)符号作弊-这些是您在shell中键入的等效命令。的$2,实际上是启动了壳中有在任何情况下,没有引号-启动的外壳没有看到任何报价。

如您所见,DQ命令只是回显文件名。SQ命令运行该basename命令并捕获其输出,然后回显捕获的输出。一点简化主义者的思想表明,DQ命令可以写为-print而不是使用-exec,SQ命令可以写为-exec basename {} \;

如果您使用的是GNU
find,则它支持该-printf操作,随后可以执行格式指令,从而basename无需运行。但是,这仅在GNU中可用find;此处的其余讨论适用于find您可能遇到的任何版本。



 类似资料:
  • 什么会导致方法停止工作? 最后一页总是与第一页相反的顺序,怎么会呢?

  • 问题内容: 我浏览了一些帖子,并且阅读了多个JPA不支持接口的地方。有人可以分享真实项目中的含义吗?这是否意味着我们无法为接口添加注释? 问题答案: 这意味着您不能在接口上进行映射(注释)或查询。您只能查询@Entity类,并且只能将它们放在真实类中,而不能放在接口上。通常这不是问题,接口没有状态,因此在大多数情况下与持久性没有真正关系。您仍然可以在模型中使用接口,只是不能直接映射它们。 如果您有

  • 我正在创建一个用户界面,允许用户通过拖放界面创建数据库表(及其字段和关系)。 这是我创建的jsFiddle,尽管它看起来有很多事情要做,但实际上它只是演示问题所需的最低限度。以下是我的要求,jsPlumb很好地单独处理了这些要求,但是当我试图把它们放在一起时,我会遇到问题。特别是,它将#2和#3结合在一起是一个问题。 表格可以在画布上拖动(使用jsPlumb.draggable()) 表中的字段可

  • 我有一个基本的 VPC,其中包含两个运行 Apache 的 Linux EC2 实例,它们位于经典 ELB 后面。 我想从web应用程序中使用DynamoDB,这要求EC2实例具有出站互联网访问,因为DynamoDBendpoint无法通过后端获得。 我正在使用 ELB 来避免将公有 IP 附加到 EC2 实例,因此我宁愿不附加它们,以便可以访问 DynamoDB。 在这一点上,我被卡住了。 我设

  • 您可以看到Android Studio预览经常更新。如果你不想处理各种各样的bug,你最好使用一个稳定的版本。 如果你想使用更多的功能,你应该总是保持最新的版本,以避免错误。