希望是一个简单的问题和我的谜题中的最后一块...... :-)我在os x下的终端中运行了一个shell脚本。它包含其他内容:
name=$(basename "$file")
printf "%s" "\"$name\";"
...这很好......但是让我们说文件名包含双引号 - IMA" G09%' 27.jpg - 然后输出将是:
" IMA" G09%' 27.jpg;"
......那会"打破"我的行打算稍后放入db(双引号)。所以我需要逃避它,所以我得到输出:
" IMA \" G09%' 27.jpg;"
......但我无法弄明白......怎么样? : - )
编辑 - 结果:在anubhava的帮助下,这就是我使用的(获取包含类型/创建者的文件信息):
#!/bin/bash
find . -type f -name '*' -print0 | while IFS= read -r -d '' file
do
name=$(basename "$file")
path=$(dirname "$file")
# full_path=$(readlink -f "$file") # This only works on Linux
full_path=$(echo "$PWD/${file#./}")
extension=${name##*.}
size_human_readable=$(ls -lh "$file" | awk -F' ' '{print $5}')
size_in_bytes=$(stat -f "%z" "$file")
creation_date=$(stat -f "%SB" "$file")
last_access=$(stat -f "%Sa" "$file")
last_modification=$(stat -f "%Sm" "$file")
last_change=$(stat -f "%Sc" "$file")
creator=$(mdls -name kMDItemFSCreatorCode "$file")
printf "\"%q\";" "$name"
printf "%s" "\"$full_path\";"
printf "%s" "\"$extension\";"
printf "\"$size_human_readable\";"
printf "\"$size_in_bytes\";"
printf "\"$last_modification\";"
printf "%s" "\"$creator\""
printf "\n"
done
答案 0 :(得分:2)
将printf
与%q
一起使用:
name='file"naeme.txt'
printf "\"%q;\"" "$name"
"file\"naeme.txt;"
答案 1 :(得分:0)
这是另一种方法,使用sed
来控制转义:
printquoted() {
printf '"%s";' "$(LC_ALL=C sed 's/["]/\\&/g' <<<"$1")"
}
printquoted "$name"
printquoted "$full_path"
printquoted "$extension"
...etc
如果事实证明除了双引号之外还有其他事情需要转义(例如,反斜杠本身),您可以将它们添加到sed
[]
表达式中(例如{{1}将转义双引号和反斜杠。
请注意,如果字符串包含任何换行符(在文件名中是合法的),这种方法将会非常失败。