Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
String 终端查找命令:操作输出字符串_String_Bash_Terminal - Fatal编程技术网

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

String 终端查找命令:操作输出字符串,string,bash,terminal,String,Bash,Terminal,我试图通过find命令操作文件名: find . -name "*.xib" -exec echo '{}' ';' 例如,这可能会打印: ./Views/Help/vhelp.xib 我想说: ./Views/Help/vhelp.strings 我尝试的是: find . -name "*.xib" -exec echo ${'{}'%.*} ';' 但是,{}未被识别为字符串或其他内容 我还尝试了以下方法: find . -name "*.xib" -exec filename='{

我试图通过find命令操作文件名:

find . -name "*.xib" -exec echo '{}' ';'
例如,这可能会打印:

./Views/Help/vhelp.xib

我想说:

./Views/Help/vhelp.strings

我尝试的是:

find . -name "*.xib" -exec echo ${'{}'%.*} ';'
但是,{}未被识别为字符串或其他内容


我还尝试了以下方法:

find . -name "*.xib" -exec filename='{}' ";" -exec echo ${filename%.*} ";"
但它试图执行名为“filename”的命令,而不是分配变量:

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

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

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/'

对于这种简单的搜索,您可以使用纯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
。对于包含有趣字符的文件名,此解决方案是安全的。

Perfect,我想了解我的试验失败的原因。谢谢。当然,如果文件名包含一个引号,您的第一个方法会失败。另外,请尝试
触摸$'lol.xib\n有趣的.xib'
,看看会发生什么。。。在这里,这两种方法都惨遭失败。我希望这不会在生产脚本中使用。@gniourf\u gniourf如果确实存在允许在文件名中使用这些字符的生产环境,那么只需保存一个脚本
echo“${1%.xib}.strings”
,并使用
-exec./script'{}'运行即可@livibetter是的!或者,您可以使用globstar,完全不用
查找
来进行这种简单的搜索。我编辑了答案,解释了为什么您不能简单地使用
-exec filename='{}';“
,请务必阅读它。
#!/bin/bash

shopt -s globstar
shopt -s nullglob

found=( **.xib )

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