2012-01-12 1 views
0

find 명령의 출력이 파일 시스템의 파일 또는 디렉토리 인 경우 절대 경로를 인쇄하는 함수에 대해 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

+0

나는'readlink'가 당신이 기대하는 바를 확신하지 못합니다. 최소한 필자가 가지고있는 MacOS X 및 Linux 시스템에서는 주어진 파일 이름이 심볼릭 링크가 아닌 경우 오류가 발생합니다. 나는 당신이 원하는 것이'realpath()'함수 또는 시스템 호출로부터의 출력을 제공하는 비슷한 프로그램이라고 생각한다. –

답변

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

0

가장 좋은 해결책은 명령이 호출되기 전에 find에 주어진 경로를 절대 경로로 바꾸는 것입니다. 이 다음 bash 1-liner는 find 명령을 인터셉트하여 경로를 조작 한 다음 실제 find 명령을 호출하여 정확하게 수행합니다. 그 위의 siegex 대답

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

적응력 zsh을 작동 :

# usage: afind . -name \*.html 
afind() { baseDir=$(readlink -f $1); shift; command find $baseDir "[email protected]" } 
관련 문제