终端查找命令:操作输出字符串

时间:2012-11-26 11:12:00

标签: string bash terminal

我正在尝试从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:没有这样的文件或目录

3 个答案:

答案 0 :(得分:7)

您不能将参数扩展与文字字符串一起使用。首先尝试将其存储在变量中:

find . -name '*.xib' -exec bash -c "f='{}' ; echo \${f%.xib}.strings" \;

-exec在命令之后看到第一个参数,因此你不能简单地给它filename='{}',因为find不使用sh来执行你给出的内容它。如果你想运行一些shell东西,你需要使用shbash来结束。

或使用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/'