使用xargs处理特殊字符

7
我有以下问题。 我有一个包含文件系统中某些路径/文件的文件。 由于某种原因,这些路径包括整个特殊字符范围,如空格、单/双引号,甚至有时还包括版权ASCII。
我需要运行文件的每一行并将其传递给另一个命令。
我到目前为止尝试过的是:
<input_file xargs -I % command %

在我收到xargs的消息之前它是有效的。

xargs: unmatched single quote; by default quotes are special to xargs unless you use the -0 option

但是对我来说,使用这个选项根本不起作用。
xargs: argument line too long

有没有解决特殊字符问题的方法,不一定要使用xargs,但需要将行作为原样传递给命令。

非常感谢提前。


从技术上讲,符合POSIX标准的文件名可以包含除'\0'和'/'之外的任何字节。因此,如果您需要处理一组文件,这些文件名可能包含“奇怪的符号”,则应选择唯一可用的分隔符'\0'。不知道是否可以将文件列表转换为'\0'分隔的列表。目前使用什么符号来分隔文件名? - user3159253
哈,谢谢提示。我从来没有想过更改分隔符。但现在我已经做到了,看起来它能够工作:<input_file xargs -d '\n' command。 - derchris
挑刺一下,但是“版权ASCII”这种说法并不存在。 - n. m.
2个回答

8

处理文件名时应使用\0 NULL字符进行分隔。

可以使用以下方法实现:

find . <args> -print0 | xargs -0

如果您必须使用文件名处理该文件,请将 '\n' 更改为 '\0',例如:

tr '\n' '\0' < filename | xargs -0 -n1 -I% echo "==%=="

-n 1的意思是:

-n max-args 每个命令行最多使用max-args个参数。

你应该使用"%"引号来包含%


“tr” 位元不起作用,因为“tr”不接受文件作为参数。您必须将“cat filename”导入管道中。 - Aserre
谢谢Nemo,最终我只是用xargs更改了定界符:<input_file xargs -d '\n' command - derchris

0

在我的Mac OS X上,xargs -0 -n1 -I% echo "==%=="的解决方案对我来说不起作用,所以我找到了另一种方法。

<input_with_single_quotes cat | sed "s/'/\\\'/" | xargs -I {} echo {}

这将用\'替换'字符,以作为xargs命令的输入。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接