2012-01-12 51 views
0

我想在linux中将find命令别名为一个函数,该函数在find命令的输出是文件系统上的文件或目录时将打印绝对路径?如果结果是文件/目录,找到带绝对路径的命令

这是我到目前为止,但它不工作的权利。


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

任何想法我做错了什么?

+0

它的工作原理我的系统上,除了文件级和包含空格的目录名(因为'因为我在$(发现“ $ @“)'由空格,制表符和换行符分隔 - 所有这些文件名都是合法的,但制表符和换行符无疑是相当罕见的)。你发现什么“对此并不正确”? – ruakh 2012-01-12 01:04:41

+0

我不相信'readlink'能做到你所期望的。至少在我的MacOS X和Linux系统上,如果给出的文件名不是符号链接,它至少会出错。我怀疑你想要的是一个类似的程序,它提供'realpath()'函数或系统调用的输出。 – 2012-01-12 02:37:13

回答

2
## 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。你的功能可以用来输入,并打印绝对路径。

+0

+1聪明!也不知道'<()' – harpo 2012-01-12 06:29:06

0

最好的解决方法是在调用命令之前把给予find路径为绝对路径。下面的bash 1-liner通过拦截find命令,操纵路径然后调用真正的find命令来完成此操作。

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

高于siegex答案的适配工作与ZSH:

# usage: afind . -name \*.html 
afind() { baseDir=$(readlink -f $1); shift; command find $baseDir "[email protected]" } 
相关问题