我有一個腳本,它執行大量的文件處理,並且它足夠接收使用空字符作爲安全分隔符的路徑。但是,它將所有路徑處理爲絕對路徑(節省一些頭痛),但是對於輸出目的來說這些路徑有點不便,所以我想從輸出中刪除一部分路徑。現在,有很多選項值得思考,但難點在於以一種對我可能遇到的任意路徑安全的方式使用這些選項,這就是事情變得棘手的地方。修剪文件路徑的最簡單,安全的方法
這裏有一個簡單的例子:
#!/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