检查一个目录是否递归地反转路径

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

可能是一个例子。

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

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

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

希望我能在这方面做点什么。 喜欢总是建议,算法和变通办法欢迎:)


试试这个,用圆括号启动一个子shell,这样cd命令不会改变当前shell的当前目录

(while [ ! -d "$FOLDER" ];do cd ..;done;pwd)

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
}

一种使用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|%sn|, 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
链接地址: http://www.djcxy.com/p/97115.html

上一篇: Check if a directory exists recursively reversing the path

下一篇: Check if passed argument is file or directory in Bash