我正在寻找一个sed
命令来将人类可读的文件或目录路径(如标准终端中显示的或由 输出find
)更改为可用作 bash 参数*的命令,例如将字符串更改My Books/Pride & Prejudice.pdf
为My\ Books/Pride\ \&\ Prejudice.pdf
.
目前,我只是在\
very 或空格之前插入一个&
空格,但我想在各种边缘情况下都会出现这种情况。因此,我想知道是否存在更通用的解决方案。
*我意识到这个问题的最一般版本可能是不可能的 - 将路径作为参数传递以由任意程序(例如进一步的sed
操作)处理可能需要每个程序的不同转义模型。但我只想直接使用输出作为路径,例如到cd
那里或调用cat
它们。
答案1
printf '%q\n' 'My Books/Pride & Prejudice.pdf'
将给出您想要的输出。例如,您可以使用 glob 模式printf '%q\n' *
来获取多个文件的结果。
根据您的用例,您可以使用find+exec
组合而不需要转义。例如,find -type f -name '*.txt' -exec cat {} +
将正确地将匹配的文件名传递给cat
命令。
另一种选择是,如果您的文件名没有单引号和换行符等麻烦的字符,您可以手动用单引号将文件名括起来并将其传递给另一个命令。例如:ls -l 'My Books/Pride & Prejudice.pdf'