我想在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,你最好使用一个稳定的版本。 如果你想使用更多的功能,你应该总是保持最新的版本,以避免错误。
根据Thymeleaf