linux - 仅当 Linux bash 中存在子文件夹时,才获取带有文件名的当前目录(非完整路径)

标签 linux bash shell directory

我已经准备了一个 bash 脚本来只获取目录(不是完整路径)和文件所在的文件名。仅当文件位于子目录中时才必须执行此操作。

例如: 如果输入是 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) 目录之后),子目录将在那里。

此脚本将起作用。我可以使用此脚本(仅当模块是电子邮件时)来获取输出。但即使子目录存在于其他模块中,脚本也应该可以工作。也许我应该计算目录?如果有两个以上的目录(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

最佳答案

使用 shell 参数扩展:

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

关于linux - 仅当 Linux bash 中存在子文件夹时,才获取带有文件名的当前目录(非完整路径),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46434506/

相关文章:

关闭动态创建的线程

bash - 打印错误信息的正确方法

linux - while 循环中的 Case 语句,shell 脚本

linux - 使用 find 命令 rsync 备份文件到远程服务器

ruby - ruby 和 shell 之间不同的 sudo 环境变量

bash - 案例声明没有捕获空字符串

Linux RADIUS 日志

linux - 测试 Bash 反向 Shell

c++ - 由于 sin6_port 值,sendto 在 Linux 中的 UDP 原始套接字 ipv6 上返回无效参数?

安卓工作室 : How to integrate Git from Windows 10 Ubuntu bash?