5

我正在尝试从 find 命令操作文件名:

find . -name "*.xib" -exec echo '{}' ';'

例如,这可能会打印:

./Views/Help/VCHelp.xib

我想做:

./Views/Help/VCHelp.strings

我尝试了什么:

find . -name "*.xib" -exec echo ${'{}'%.*} ';'

但是,'{}' 没有被识别为字符串或其他东西......


我还尝试了以下方法:

find . -name "*.xib" -exec filename='{}' ";" -exec echo ${filename%.*} ";"

但它试图执行一个名为“文件名”的命令,而不是分配变量:

查找:文件名:没有这样的文件或目录

4

3 回答 3

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/'
于 2012-11-26T11:27:26.803 回答
2

对于这样一个简单的搜索,您可以使用纯 bash 解决方案:

#!/bin/bash

shopt -s globstar
shopt -s nullglob

found=( **.xib )

for f in "${found[@]}"; do
   echo "${f%xib}strings"
done

打开globstarshell 选项可以**“匹配所有文件以及零个或多个目录和子目录”(引用自 bash 参考手册)。如果没有匹配项,该nullglob选项会有所帮助:在这种情况下,glob 将被扩展为空,而不是丑陋的**.xib. 对于包含有趣字符的文件名,此解决方案是安全的。

于 2012-11-26T14:23:38.417 回答
1
find . -name "*.xib" | sed -e 's/\.xib$/.strings/'
于 2012-11-26T11:27:13.310 回答