【问题标题】:find command with absolute paths if result is a file/dir如果结果是文件/目录,则使用绝对路径查找命令
【发布时间】:2012-02-08 08:55:18
【问题描述】:

如果 find 命令的输出是文件系统上的文件或目录,我想将 linux 中的 find 命令别名为将打印绝对路径的函数?

这是我目前所得到的,但它不能正常工作。


find_with_abspath(){
    for i in $(find "$@")
    do
        if [ -e "$i" ];
        then
            readlink -m "$i"
        else
            echo -n "$i"
        fi
    done
}

任何想法我做错了什么?

【问题讨论】:

  • 它在我的系统上工作,除了包含空格的文件名和目录名(因为for i in $(find "$@") 由空格、制表符和换行符分割——所有这些在文件名中都是合法的,但制表符诚然,换行符很少见)。您发现什么“不正常”?
  • 我不相信 readlink 会按照您的预期行事。至少在我拥有的 MacOS X 和 Linux 系统上,如果给定的文件名不是符号链接,则会出错。我怀疑你想要的是一个类似的程序,它提供realpath() 函数或系统调用的输出。

标签: bash path find


【解决方案1】:
## define your function
abspath() {
    while read -r; do
        [[ -d $REPLY || -f $REPLY ]] && readlink -m "$REPLY"
    done
}

## run as:
$ find foo -iname "*.png" | abspath

## or:
$ abspath < <(find .. -.. ..)

您无需在函数中重新定义find。您的函数可用于获取输入并打印绝对路径。

【讨论】:

    【解决方案2】:

    最好的解决方案是在调用命令之前将给find的路径变成绝对路径。下面的 bash 1-liner 正是通过拦截 find 命令、操作路径然后调用真正的 find 命令来实现这一点。

    find(){ ( set -f; command find $(readlink -f $1) ${@:2}; ) };
    

    【讨论】:

      【解决方案3】:

      上述适用于 ZSH 的 siegex 答案的改编:

      # usage: afind . -name \*.html
      afind() { baseDir=$(readlink -f $1); shift; command find $baseDir "$@" }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-09-04
        • 2014-10-19
        • 1970-01-01
        • 2018-12-29
        • 2012-02-07
        • 2013-08-25
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多