我有点困惑!我不知道如何提出这个问题。
可能有一个例子。
我正在编写一个bash脚本,用于检查当前目录中是否有名为“FNS”的特定文件夹。要检查文件是否存在,我会这样做。
FOLDER=FNS
if [ -f $FOLDER ];
then
echo "File $FOLDER exists"
else
# do the thing
fi
问题出现如果文件不存在!我希望脚本记下当前路径并移回目录[我的意思是cd ..在命令行中,我不确定我是否在这里使用正确的词汇表]并检查文件是否存在,如果不存在,再向后退一步,直到它所在的目录显示[它肯定存在]。当找到将路径存储在变量中时。
执行的当前目录不应该更改。我尝试将pwd
传递给变量并切换到最后一个斜线和其他一些东西但没有成功!
希望我能在这方面做点什么。 像往常一样建议,算法和解决方案是受欢迎的:)
答案 0 :(得分:2)
试试这个,括号启动一个子shell,这样cd命令就不会改变当前shell的当前目录
(while [ ! -d "$FOLDER" ];do cd ..;done;pwd)
答案 1 :(得分: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
}
答案 2 :(得分: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
答案 3 :(得分: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
。
答案 4 :(得分: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