在Linux下的bash shell中找到(GNU findutils)4.4.2,我写道:
touch FOO
find . -name FOO -exec echo {} `echo ./FOO {} | tr [A-Z] [a-z]` \;
我得到了
./FOO ./foo ./FOO
为什么输出与./FOO ./foo ./foo?
不同缩小问题范围:
find . -name FOO -exec echo `echo {} | tr [A-Z] [a-z]` \;
产生"./FOO"
而不是"./foo"
我很困惑。
答案 0 :(得分:4)
shell在启动find
之前在后退之间执行命令。
因此,为您的第一个命令行实际执行的find
命令是:
find . -name FOO -exec echo {} ./foo {} \;
这应该会给你你看到的输出:
./FOO ./foo ./FOO
第二个命令也首先在back-ticks之间执行命令,因此对第二个命令行实际执行的find
命令是:
find . -name FOO -exec echo {} \;
应该并且确实会回复./FOO
。
答案 1 :(得分:1)
在执行find
命令之前执行命令替换。这意味着你的初始命令
find . -name FOO -exec echo {} `echo ./FOO {} | tr [A-Z] [a-z]` \;
实际上变成了
find . -name FOO -exec echo {} ./foo {} \;
导致
./FOO ./foo ./FOO
如果要在查找结果上执行任意shell代码,请调用shell:
find -name FOO -exec bash -c 'echo "$1" | tr [A-Z] [a-z]' -- {} \;
(请注意,如果在当前目录中搜索,则不需要.
)
当然,如果您所做的只是转换为小写,那么最好这样做:
find -name FOO | tr [A-Z] [a-z]
答案 2 :(得分:0)
您的-exec语法错误。使用此:
find . -name FOO -exec bash -c "echo -n {}; echo ' ./FOO' {} | tr '[A-Z]' '[a-z]'" \;
./FOO ./foo ./foo