1

私はここでちょっと混乱しています!質問の出し方がわかりません。

例を挙げてください。

「FNS」という名前の特定のフォルダが現在のディレクトリにあるかどうかをチェックするbashスクリプトを作成中です。ファイルが存在するかどうかを確認するために、これを行います。

        FOLDER=FNS
        if [ -f $FOLDER ];
        then
        echo "File $FOLDER exists"
        else
        # do the thing
        fi

ファイルが存在しない場合、問題が発生します。スクリプトで現在のパスをメモし、ディレクトリに移動して[コマンドラインでcd ..を意味します。ここで正しい語彙を使用しているかどうかわかりません]、ファイルが存在するかどうかを確認します。 、それが存在するディレクトリが表示されるまで、もう一度1ステップ戻ります[必ず存在します]。見つかったら、パスを変数に格納します。現在の実行ディレクトリは変更されません。変数にを渡してpwd、最後のスラッシュやその他の要素までカットしようとしましたが、成功しませんでした。

私がこの点で何かできることを願っています。いつもの提案のように、アルゴリズムと回避策は大歓迎です:)

4

5 に答える 5

3

これを試してください。かっこでサブシェルを開始して、cdコマンドが現在のシェルの現在のディレクトリを変更しないようにします。

(while [ ! -d "$FOLDER" ];do cd ..;done;pwd)
于 2012-07-06T10:50:31.923 に答える
1

を使用する1つの方法perl

内容script.pl(ディレクトリはハードコーディングされていますが、引数として読み取るようにプログラムを変更するのは簡単です):

use warnings;
use strict;
use File::Spec;
use List::Util qw|first|;

## This variable sets to 1 after searching in the root directory.
my $try;

## Original dir to begin searching.
my $dir = File::Spec->rel2abs( shift ) or die;

do {
    ## Check if dir 'FNS' exists in current directory. Print
    ## absolute dir and finish in that case.
    my $d = first { -d && m|/FNS$| } <$dir/*>;
    if ( $d ) { 
        printf qq|%s\n|, File::Spec->rel2abs( $d );    
        exit 0;
    }   

    ## Otherwise, goto up directory and carry on the search until
    ## we reach to root directory.
    my @dirs = File::Spec->splitdir( $dir );
    $dir = File::Spec->catdir( @dirs[0 .. ( $#dirs - 1 || 0 )] )
} while ( $dir ne File::Spec->rootdir || $try++ == 0);

検索を開始するディレクトリで実行します。相対パスまたは絶対パスにすることができます。このような:

perl script.pl /home/birei/temp/dev/everychat/

また

perl script.pl .

ディレクトリが見つかった場合は、絶対パスが出力されます。私のテストの例:

/home/birei/temp/FNS
于 2012-07-05T22:39:22.397 に答える
1

bashのpushdおよびpopdの組み込みコマンドが役立つ場合があります。擬似コードの場合:

function FolderExists() { ... }

cds = 0
while (NOT FolderExists) {
    pushd ..
    cds=cds+1;
}

store actual dir using pwd command

for(i=0;i<cds;i++) {
    popd
}
于 2012-07-05T21:59:06.943 に答える
1
#!/bin/bash
dir=/path/to/starting/dir    # or $PWD perhaps
seekdir=FNS

while [[ ! -d $dir/$seekdir ]]
do
    if [[ -z $dir ]]    # at /
    then
        if [[ -d $dir/$seekdir ]]
        then
            break    # found in /
        else
            echo "Directory $seekdir not found"
            exit 1
        fi
    fi
    dir=${dir%/*}
done

echo "Directory $seekdir exists in $dir"

-fテストは通常​​のファイルを対象としていることに注意してください。ディレクトリをテストしたい場合は-d、私が持っているように使用してください。

于 2012-07-05T22:50:32.520 に答える
1
    #!/bin/bash

FOLDER="FNS"
FPATH="${PWD}"
P="../"

if [ -d ${FOLDER} ];

then 

    FPATH="$(readlink -f ${FOLDER})"
    FOLDER="${FPATH}"
    echo "FNS: " $FPATH

else

    while [ "${FOLDER}" != "${FPATH}" ] ; do
    NEXT="${P}${FOLDER}"    

    if [ -d "${NEXT}" ];
    then
        FPATH=$(readlink -f ${NEXT})
        FOLDER="${FPATH}"
        echo "FNS: " $FPATH
    else
        P="../${P}"
    fi

    done

fi
于 2012-07-05T22:59:49.397 に答える