从路径中提取目录


123

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

Answers:


203
dirname $file

是您要寻找的


+1,击败我。本来会更快,但是被提示要输入更多dirname $file
matchew 2011年

1
dirname "$file",而是。如果文件名或目录名中有空格,则不带引号会导致行为异常。
查尔斯·达菲

fml,问题应该是从文件中提取绝对目录,我该怎么做?我猜dirname产生相对路径
Alexander Mills

在成功的批处理脚本中完成该任务有多么困难,这是非常出色的-我想不使用它们的另一个原因!
bunkerdive

47
dirname $file

将输出

stuff/backup

与之相反basename

basename $file

将输出

file.zip

我认为Matt可以从那里找到它(man dirname):)
Matthieu

1
我想我们所有人都在这里。只是一个猜测。但是我只是想将我的答案与您的答案区分开。=)
matchew 2011年

是的,我也经常使用basename,这非常漂亮=)但是我在Google上找不到关于返回文件目录的任何信息!我想我不是在寻找正确的词。哈,我们三个人都是麦特吗?:D
马特

1
考虑添加必要的引号,以确保这些命令可以使用包含空格(全局字符等)的名称。
查尔斯·达菲

3

${file%/*}由于您将不依赖外部命令,因此使用Urvin / LuFFy建议的类似方法在技术上会更好。以相同的方式获取基本名称${file##*/}。除非需要,否则无需使用外部命令。

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

这样也将完全符合POSIX。希望能帮助到你!:-)


1
一种情况下,dirname相对于(更有效的)内置方法有一个优势,那就是如果您不确定自己的道路是否完全合格。如果有file=file.zipdirname "$file"将返回.,而${file%/*}将返回file.zip
查尔斯·达菲

1
...当然,您可以分支:case $file in */*) dir=${file%/*};; *) dir=.;; esac仍然是POSIX-y并解决了这个问题。
查尔斯·达菲

2

为了directorypathfilepath

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

1

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

它将返回 /home/~username/stuff/backup/

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.