我有一个脚本,它执行大量的文件处理,并且它足够接收使用空字符作为安全分隔符的路径。但是,它将所有路径处理为绝对路径(节省一些头痛),但是对于输出目的来说这些路径有点不便,所以我想从输出中删除一部分路径。现在,有很多选项值得思考,但难点在于以一种对我可能遇到的任意路径安全的方式使用这些选项,这就是事情变得棘手的地方。修剪文件路径的最简单,安全的方法
这里有一个简单的例子:
#!/bin/sh
TARGET="$1"
find "$TARGET" -print0 | while IFS= read -rd '' path; do
# Process path for output here
path_str="$path"
echo "$path_str"
done
所以在上面的脚本我想借此path
并拆除TARGET
,在可能的最兼容的方式(例如 - 具体什么bash)的,它需要能够从字符串的开头仅删除,即 - /foo/bar
变为bar
,/foo/bar/foo
变成bar/foo
和/bar/foo
仍然是/bar/foo
。它还应该处理文件名中的任何可能的字符,包括某些文件系统支持的字符,例如tildes,冒号等,以及讨厌的反引号字符。
我使用sed
首先转义了任何可能会破坏我的正则表达式的字符,但是这是一个非常混乱的做法,所以我希望有一些更简单的方法。如果没有的话,这里的解决方案是迄今:
SAFE_CHARS='s:\([[/.*]\):\\\1:g'
target_safe=$(printf '%s' "$TARGET" | sed "$SAFE_CHARS")
path_str=$(printf '%s' "$path" | sed "s/^$target_safe//g')
有可能是几个字符缺失,我应该除了那些那些被逃脱,和任何错别字道歉。
'read'的'-d'选项是'bash'特定的(或者至少不是POSIX标准的一部分)。如果你使用它,你也可以使用其他'bash'扩展。 – chepner