Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 为什么带后缀的basename不';与find一起使用时,无法在子shell中工作?_Bash_Find_Subshell_Command Substitution - Fatal编程技术网

Bash 为什么带后缀的basename不';与find一起使用时,无法在子shell中工作?

Bash 为什么带后缀的basename不';与find一起使用时,无法在子shell中工作?,bash,find,subshell,command-substitution,Bash,Find,Subshell,Command Substitution,以下命令不执行子替换,为什么 find ./ -name "*.dng" -exec echo `basename \{\} .dng` \; find ./ -name "*.dng" -exec echo `basename \{\} .dng` \; 但这个命令起作用了: find ./ -name "*.dng" -exec basename \{\} .dng \; 我实际上想做的是在我的硬盘中找到所有的dng并执行以下操作: touch -c -r {basename}.

以下命令不执行子替换,为什么

find ./ -name "*.dng" -exec echo `basename \{\} .dng`  \;
find ./ -name "*.dng" -exec echo `basename \{\} .dng`  \;
但这个命令起作用了:

find ./ -name "*.dng" -exec basename \{\} .dng  \;
我实际上想做的是在我的硬盘中找到所有的dng并执行以下操作:

touch -c -r {basename}.RW2  {basename}.dng
touch -c -r {basename}.RW2 {basename}.dng
以下命令不执行子替换,为什么

find ./ -name "*.dng" -exec echo `basename \{\} .dng`  \;
find ./ -name "*.dng" -exec echo `basename \{\} .dng`  \;
正如Cyrus在中所说的,bash在调用
find
之前将
`basename\{\}.dng`
扩展到
{}
;所以find接收的只是
echo{}
,它没有看到
`basename\{}.dng`
部分

我实际上想做的是在我的硬盘中找到所有的dng并执行以下操作:

touch -c -r {basename}.RW2  {basename}.dng
touch -c -r {basename}.RW2 {basename}.dng
假设每个参考文件(
*.RW2
)与相应的
.dng
文件位于同一目录中,我会这样做:

find . -name '*.dng' -exec sh -c '
for dng do
  touch -c -r "${dng%.*}.RW2" "$dng"
done' _ {} +

因为bash首先运行
basename\{\}.dng
并在其输出中运行
find
命令。这需要更多详细信息。RW2文件是否与dng文件位于同一目录中,或者它们都位于发出“查找”命令的目录中?您到底需要
basename
做什么?@oguz Ismail,RW2文件与dng文件位于同一目录中。我使用basename来删除前缀。你能再解释一下
{}+
做什么吗?{}和+是$1和$2吗?或者它是sh参数?@Fractale
{}
被find替换为所选文件,
+
意味着使用尽可能多的参数运行此命令。只要检查一下
man find
,就知道了。