“tracker” 是一个命令行文件索引和搜索工具。除其他功能外,它还允许使用标签注释文件。我正在尝试从 PDF 文件中删除标签。其他文件上的其他标签已成功删除。此标签名称很长,其中包含一些特殊字符:
$ tracker tag -ts
Tags (shown by name):
setup# connections# features# upgrading# troubleshooting# recovery# specifications
#esuprt_desktop#esuprt_alienware_dsk#Alienware Aurora#alienware-aurora#Owner's Manual
file://FILEPATH.pdf
请注意标签名称中“specifications”后面的换行符。
(我在这里用 FILEPATH 代替了实际的文件名。这似乎并不相关。我之前已经成功删除了类似路径中的其他标签,并且为了以防万一移动了这个文件,但仍然无法删除它的标签)
我无法使用 删除此标签tracker tag -d TAGNAME
,大概是因为我无法表示或转义标签名称中的特殊字符。我首先尝试了以下方法:
$ tracker tag -d "setup# connections# features# upgrading# troubleshooting# recovery# specifications
#esuprt_desktop#esuprt_alienware_dsk#Alienware Aurora#alienware-aurora#Owner's Manual"
这会报告“标签已成功删除”,但这是谎言 - 标签仍然存在。这是删除不存在的标签时显示的消息:
$ tracker tag -d NONEXISTANT
Tag was removed successfully
为了使标签名称中的特殊字符可见,我使用了:
$ tracker info 'file://FILEPATH.pdf' | grep hasTag
'nao:hasTag' = 'urn:tag:setup%23%20connections%23%20features%23%20upgrading%23%20troubleshooting%23%20recovery%23%20specifications%0D%0A%23esuprt_desktop%23esuprt_alienware_dsk%23Alienware%20Aurora%23alienware-aurora%23Owner's%20Manual'
这里我们可以看到 urlencoded 的特殊字符。我之前描述的“换行符”实际上是 %0D%0A,我认为我可以使用“\r\n”在命令行上传递它(更新:这是我的错误,请参阅@steeldriver 的回答),因此,也许我的删除应该是:
$ tracker tag -d "setup# connections# features# upgrading# troubleshooting# recovery# specifications\r\n#esuprt_desktop#esuprt_alienware_dsk#Alienware Aurora#alienware-aurora#Owner's Manual"
Tag was removed successfully
这条消息又是谎言。标签仍然存在。
我在 Ubuntu 20.10 Groovy 上使用 Bash。我确实拥有标记文件的所有权和写入权限,尽管我不认为这是必需的。
答案1
在 shellprintf
和echo
(带有-e
选项的)内置命令的上下文中支持反斜杠转义,但要强制在纯字符串参数中扩展它们,您需要使用 ANSI 引用。来自man bash
:
Words of the form $'string' are treated specially. The word expands to string, with backslash-escaped characters replaced as specified by the ANSI C standard.
您的情况有点复杂,因为标签字符串中有一个单引号(撇号),但以下内容应该有效:
tracker tag -d $'setup# connections# features# upgrading# troubleshooting# recovery# specifications\r\n#esuprt_desktop#esuprt_alienware_dsk#Alienware Aurora#alienware-aurora#Owner'\''s Manual'
或者,您可以CR
使用键盘序列Ctrl+来编写字符V Enter(它将显示为^M
但实际上只是一个字符)。不要忘记在其后跟另一个Enter字符LF
。