使用bash参数扩展获取文件路径

时间:2016-06-26 02:10:25

标签: bash path

给定文件的路径,请说:​​ /home/user1/archive.zip

有人可以告诉我如何在不使用外部二进制文件的情况下删除字符串 archive.zip

我知道:

${Path2File##*/}

可以给我文件名,但我需要这个文件夹的路径。

也欢迎使用通配符理解指南或解释。

2 个答案:

答案 0 :(得分:5)

"${Path2File%\/*}"

或使用外部二进制文件

dirname "$Path2File" # Not desirable as you've mentioned already

备注:

  1. 在类型${parameter%word}的shell参数扩展中,单词被扩展为生成模式,就像在文件名扩展中一样。如果模式匹配参数的扩展值的尾部,则扩展的结果是删除了最短匹配模式的参数的值。
  2. 由于/在shell参数扩展中有特殊含义,我们只是将其转义为\/。目的是匹配文件基名,即 /example.zip中的/path/to/example.zip并将其删除。
  3. <强>参考:

    Shell [ Parameter Expansion ]

答案 1 :(得分:3)

##通配符表示任何字符都匹配。 $ a=/path/to/file $ echo ${a##*t} o/file 正在从参数中删除最长匹配模式。例如:

t

在这个例子中,我们说删除所有内容,包括/pat。它按照您的预期删除了t,但是当它发现第二个#时,它仍然继续。 (单个t将停在第一个/)。

更有用的示例是通过匹配最后一个$ echo ${a##*/} file 来删除路径。

%

$ echo ${a%/*} /path/to 匹配字符串的末尾。

/

这意味着从最右侧斜线*以及其他所有内容%中删除。

%%寻找最短的匹配。如果我们使用/,则匹配会一直回到字符串的开头,并匹配第一个字符requests.get('https://api.github.com/user', auth=HTTPBasicAuth('user', 'pass')) 并吞噬该批次。