2012-01-12 40 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]" } 
相關問題