V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Distributions
Ubuntu
Fedora
CentOS
中文资源站
网易开源镜像站
mylovesaber
V2EX  ›  Linux

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

  •  
  •   mylovesaber · 2021-12-16 04:16:55 +08:00 · 2893 次点击
    这是一个创建于 1072 天前的主题,其中的信息可能已经有所发展或是发生改变。

    已知有两个文件: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 输出的结果可以被后续命令处理?

    10 条回复    2021-12-23 20:31:42 +08:00
    ryd994
        1
    ryd994  
       2021-12-16 04:22:06 +08:00 via Android   ❤️ 3
    ${FIXED_PATH} 的效果是执行这个命令
    你需要的是 echo ${FIXED_PATH}
    echo 是输出变量的内容
    ETiV
        2
    ETiV  
       2021-12-16 04:26:06 +08:00
    处理啥?
    find 一般后面接 xargs
    mylovesaber
        3
    mylovesaber  
    OP
       2021-12-16 05:25:32 +08:00
    @ryd994 感谢提醒!看来我得早点睡觉了。。。。脑子浑了。。。
    xiaoz
        4
    xiaoz  
       2021-12-16 08:01:00 +08:00 via Android
    find 不是自带后续处理命令吗用-exec
    echoechoin
        5
    echoechoin  
       2021-12-16 11:54:04 +08:00
    bash -x 可以调试嘛
    Routeros
        6
    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
        7
    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
        8
    levinit  
       2021-12-16 18:24:29 +08:00 via iPhone
    这不是 find 报错 很明显是执行那行 fixedpath 的问题 你先 echo 下那个 ficedpath ,看看输出啥,
    cattyhouse
        9
    cattyhouse  
       2021-12-17 04:00:38 +08:00 via iPhone
    FIXED_PATH=( $(find /root -name "*test01*") )
    for i in ${FIXED_PATH[@]} ; do
    [[ -x $i ]] && source $i
    done
    mylovesaber
        10
    mylovesaber  
    OP
       2021-12-23 20:31:42 +08:00
    @huntagain2008 谢谢,其实没有这么复杂的,一个 echo 就解决了,其实 find 出来的是一个结果一行,然后通过 for 循环可以数行数的,我最初需要做到的是超过 1 行就报错,也感谢分享其他写法哈
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2636 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 15:15 · PVG 23:15 · LAX 07:15 · JFK 10:15
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.