String 从路径中提取目录

String 从路径中提取目录,string,bash,path,String,Bash,Path,在我的脚本中,我需要处理的文件的目录。例如,文件=“stuff/backup/file.zip”。我需要一种从变量$file获取字符串“stuff/backup/”的方法 dirname $file 这就是你要找的 dirname $file 将输出 stuff/backup 它与basename相反: basename $file 将输出 file.zip 只需使用$dirname/home/~username/stuff/backup/file.zip 它将返回/home/~use

在我的脚本中,我需要处理的文件的目录。例如,文件=“stuff/backup/file.zip”。我需要一种从变量
$file
获取字符串“stuff/backup/”的方法

dirname $file
这就是你要找的

dirname $file
将输出

stuff/backup
它与
basename
相反:

basename $file
将输出

file.zip

只需使用
$dirname/home/~username/stuff/backup/file.zip


它将返回
/home/~username/stuff/backup/
,以便从
文件路径
获取
目录路径

file="stuff/backup/file.zip"
dirPath=${file%/*}/
echo ${dirPath}

使用Urvin/LuFFy建议的
${file%/*}
在技术上更好,因为您不需要依赖外部命令。要以相同的方式获取basename,可以执行
${file##*/}
。除非需要,否则没有必要使用外部命令

file="/stuff/backup/file.zip"
filename=${1##*/}     # file.zip
directory=${1%/*}     # /stuff/backup

通过这种方式,它也将完全兼容POSIX。希望有帮助!:-)

+1,比我快。本可以更快,但被提示输入的不仅仅是
dirname$file
dirname“$file”
。如果没有引号,如果文件或目录名有空格,这将是错误的。fml,问题应该是从文件中提取绝对目录,我该如何做?dirname产生了相对路径,我想在win Batch脚本中实现这一点非常困难——我想这是不使用它们的另一个原因!我想马特可以从那里猜出来(曼迪纳姆):)我想我们都是马特在这里。只是猜测而已。但我只是想把我的答案和你的区别开来是的,我也经常使用basename,它非常漂亮=),但是我在google上找不到任何关于返回文件目录的信息!我想我找的词不对。哈,我们三个都是马特的d考虑添加必要的引号,以确保这些命令与包含空格的名称(全局字符等)一起工作。有一种情况下,
dirname
比(更高效的)内置方法更具优势,这就是如果您不确定您的路径是否完全合格。如果您有
file=file.zip
dirname“$file”
将返回
,而
${file%/*}
将返回
file.zip
…当然,您可以分支:
case$file in*/*)dir=${file%/*};*)dir=。;;esac仍然是POSIX-y,解决了这个问题。重复项:,