我正在尝试从find命令中操作文件名:
find . -name "*.xib" -exec echo '{}' ';'
例如,这可能会打印:
./查看/帮助/ VCHelp.xib
我想成功:
./查看/帮助/ VCHelp.strings
我尝试了什么:
find . -name "*.xib" -exec echo ${'{}'%.*} ';'
但是,“{}”未被识别为字符串或其他内容......
我也尝试了以下内容:
find . -name "*.xib" -exec filename='{}' ";" -exec echo ${filename%.*} ";"
但它正在尝试执行一个名为“filename”的命令,而不是分配变量:
find:filename:没有这样的文件或目录
答案 0 :(得分:7)
您不能将参数扩展与文字字符串一起使用。首先尝试将其存储在变量中:
find . -name '*.xib' -exec bash -c "f='{}' ; echo \${f%.xib}.strings" \;
-exec
在命令之后看到第一个参数,因此你不能简单地给它filename='{}'
,因为find
不使用sh
来执行你给出的内容它。如果你想运行一些shell东西,你需要使用sh
或bash
来结束。
或使用sed
:
find . -name '*.xib' | sed 's/.xlib$/.strings/'
答案 1 :(得分:2)
对于这种简单的搜索,您可以使用纯粹的bash解决方案:
#!/bin/bash
shopt -s globstar
shopt -s nullglob
found=( **.xib )
for f in "${found[@]}"; do
echo "${f%xib}strings"
done
启用globstar
shell选项可使**
“匹配所有文件以及零个或多个目录和子目录”(引自bash参考手册)。如果没有匹配,nullglob
选项会有所帮助:在这种情况下,glob将扩展为空,而不是丑陋的**.xib
。对于包含有趣字符的文件名,此解决方案是安全的。
答案 2 :(得分:1)
find . -name "*.xib" | sed -e 's/\.xib$/.strings/'