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
,就知道了。