2012-01-12 6 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ライナーは、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]" }