1

我在这里有点困惑!我不知道如何提出这个问题。

可以举个例子。

我正在编写一个 bash 脚本,它检查名为“FNS”的特定文件夹是否在当前目录中。要检查文件是否存在,我这样做。

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

如果文件不存在,就会出现问题!我希望脚本记下当前路径并移回一个目录[我的意思是 cd .. 在命令行中,我不确定我是否在这里使用了正确的词汇]并检查文件是否存在,如果不存在,再次后退一步,直到它存在的目录出现[它肯定存在]。找到时将路径存储在变量中。当前的执行目录不应该改变。我尝试将 传递pwd给一个变量并切割到最后一个斜杠和其他一些东西但没有成功!

希望我能在这方面做点什么。像往常一样,欢迎提出建议、算法和变通方法:)

4

5 回答 5

3

试试这个,用括号启动一个子shell,所以 cd 命令不会更改当前 shell 的当前目录

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

bash pushdpopd内置命令可以帮助您。在伪代码中:

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

一种使用方式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
#!/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 回答