2017-09-26 84 views
0

我准备了一个bash脚本来获取文件名所在的目录(不是完整路径)。只有当文件位于子目录中时才能完成。仅当Linux文件夹中存在子文件夹时才获取当前目录(非完整路径)

例如: 如果输入为src/email/${sub_dir}/Bank_Casefeed.email,则输出应为${sub_dir}/Bank_Casefeed.email

如果输入是src/layouts/Bank_Casefeed.layout,则输出应为Bank_Casefeed.layout。我可以很容易地使用basename命令得到这个。

src/basefolder始终为常量。在某些情况下(在src/email(basefolder)目录之后),sub_directories将在那里。

此脚本将起作用。我可以使用此脚本(仅当模块是电子邮件时)才能获得输出。但即使子目录存在于其他模块中,脚本也应该可以工作。也许我应该计算目录?如果有两个以上的目录(src/basefolder),脚本应该获取子目录。有没有更好的方法来处理这两种情况?

#!/bin/bash 
filename=`basename src/email/${sub_dir}/Bank_Casefeed.email` 
echo "filename is $filename" 

fulldir=`dirname src/email/${sub_dir}/Bank_Casefeed.email` 
dir=`basename $fulldir` 
echo "subdirectory name: $dir" 

echo "concatenate $filename $dir" 
Entity=$dir/$filename 
echo $Entity 

回答

1

我知道可能有更简单的方法来做到这一点。但我相信你可以操纵输入字符串。例如:

#!/bin/bash 

sub_dir='test' 
DIRNAME1="src/email/${sub_dir}/Bank_Casefeed.email" 
DIRNAME2="src/email/Bank_Casefeed.email" 

echo $DIRNAME1 | cut -f3- -d'/' 
echo $DIRNAME2 | cut -f3- -d'/' 

这将删除前两个目录。

2

使用壳参数扩展:

sub_dir='test' 
files=("src/email/${sub_dir}/Bank_Casefeed.email" "src/email/Bank_Casefeed.email") 

for f in "${files[@]}"; do 
    if [[ $f == *"/$sub_dir/"* ]]; then 
     echo "${f/*\/$sub_dir\//$sub_dir\/}" 
    else 
     basename "$f" 
    fi 
done 
test/Bank_Casefeed.email 
Bank_Casefeed.email 
+0

由于格伦。 sub_dir可以是任何东西。文件是在运行时由另一个脚本创建的。因此在此脚本中不能设置sub_dir名称。只是文本文件中的文件列表。有办法处理吗? – Ela

+0

我不明白这个评论如何适合你的问题。这有助于:http://mywiki.wooledge.org/BashFAQ/001 –

相关问题