有没有办法可以实现 find 或者 locate 输出的结果可以被后续命令处理?

2021-12-16 04:16:55 +08:00
 mylovesaber

已知有两个文件:test01 和 test0101

root@debian ~/test # ls t*
test01  test0101  t.sh

直接运行 find 命令的话,输出一切正常,但如果将 find 命令的输出结果赋值给一个新的变量,然后最终输出那个变量的话:

root@debian ~/test # cat t.sh
FIXED_PATH=$(find /root -name "*test01*")
${FIXED_PATH}

输出就是报错信息:

root@debian ~/test # bash t.sh 
t.sh: line 3: /root/test/test0101: Permission denied

什么原因导致的呢?有没有办法可以实现 find 或者 locate 输出的结果可以被后续命令处理?

2723 次点击
所在节点    Linux
10 条回复
ryd994
2021-12-16 04:22:06 +08:00
${FIXED_PATH} 的效果是执行这个命令
你需要的是 echo ${FIXED_PATH}
echo 是输出变量的内容
ETiV
2021-12-16 04:26:06 +08:00
处理啥?
find 一般后面接 xargs
mylovesaber
2021-12-16 05:25:32 +08:00
@ryd994 感谢提醒!看来我得早点睡觉了。。。。脑子浑了。。。
xiaoz
2021-12-16 08:01:00 +08:00
find 不是自带后续处理命令吗用-exec
echoechoin
2021-12-16 11:54:04 +08:00
bash -x 可以调试嘛
Routeros
2021-12-16 12:02:49 +08:00
[root@Aliyun ~]# find /root/ -name "main*"
/root/main.go
/root/main
/root/main.exe
[root@Aliyun ~]# cat t.sh
#!/bin/bash
FIXED_PATH=$(find /root/ -name "main*")
echo ${FIXED_PATH}
[root@Aliyun ~]# ./t.sh
/root/main.go /root/main /root/main.exe
[root@Aliyun ~]#
huntagain2008
2021-12-16 13:24:22 +08:00
#1
#5
感谢上面 2 位的回答。本人非程序员,开始我以为是文件权限问题,可是楼主用的 root,应该无关。然后看了前面的回复我才搞懂了点。

楼主用的命令替换,用 shell 脚本将命令输出提取信息,并将其赋给变量。
其中一种将命令输出赋给变量:
$()格式 testing=$(date)
shell 会运行命令替换符号中的命令,并将其输出赋给变量 testing 。
楼主的情况就是 find 查找文件得到‘~/test/test01 ~/test/test0101 ’将其赋给 FIXED_PATH ,这一步是正确的。下一步使用变量 FIXED_PATH,楼主可能认为 find 命令得到的结果是一个数组,于是用了${FIXED_PATH},但我认为这不是数组,数组应该是(~/test/test01 ~/test/test0101)
> 你可能还见过通过${variable}形式引用的变量。变量名两侧额外的花括号通常用来帮助识别美元符后的变量名。

第二行${FIXED_PATH}实际就是~/test/test01 ~/test/test0101 我想应该是被解释为尝试执行~/test/test01 发现没有执行权限,如果再
$ chmod u+x ~/test/test01
这样给~/test/test01 加上执行权限,那么就不会报错了。
levinit
2021-12-16 18:24:29 +08:00
这不是 find 报错 很明显是执行那行 fixedpath 的问题 你先 echo 下那个 ficedpath ,看看输出啥,
cattyhouse
2021-12-17 04:00:38 +08:00
FIXED_PATH=( $(find /root -name "*test01*") )
for i in ${FIXED_PATH[@]} ; do
[[ -x $i ]] && source $i
done
mylovesaber
2021-12-23 20:31:42 +08:00
@huntagain2008 谢谢,其实没有这么复杂的,一个 echo 就解决了,其实 find 出来的是一个结果一行,然后通过 for 循环可以数行数的,我最初需要做到的是超过 1 行就报错,也感谢分享其他写法哈

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/822496

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX