我正在使用xargs来尝试回显文件的名称,然后是其内容。这是命令
find output/ -type f | xargs -I {} sh -c "echo {} ; cat {}"
但由于某种原因,cat
之后的第二次替换没有被替换。仅适用于某些文件,因此某些文件可以正常工作。
要清楚,我不是在寻找一个让我回显文件名后跟其内容的命令,我试图理解为什么这个特定的命令不起作用。
答案 0 :(得分:4)
原来这个命令太长了,所以它使用较短的文件名而没有更长的文件名。来自man xargs
-I replstr
Execute utility for each input line, replacing one or more occurrences of replstr in up to replacements (or 5 if no -R flag is specified) arguments to utility with the
entire line of input. The resulting arguments, after replacement is done, will not be allowed to grow beyond 255 bytes; this is implemented by concatenating as much
of the argument containing replstr as possible, to the constructed arguments to utility, up to 255 bytes. The 255 byte limit does not apply to arguments to utility
which do not contain replstr, and furthermore, no replacement will be done on utility itself. Implies -x.
答案 1 :(得分:1)
名称中有空格的文件是否会产生问题?尝试添加\“,像这样:
find output/ -type f | xargs -I {} sh -c "echo \"{}\" ; cat \"{}\""
这对我使用Bash很有用。
答案 2 :(得分:1)
Carlos' answer中指出了问题的根本原因,但没有解决方案。
经过一番谷歌搜索,我找不到提高255个字符限制的方法。
解决此问题的一种可能方法是使用shell变量作为替代。
示例:
find . | xargs -I% sh -c 'F="%";iconv -f gb2312 -t utf-8 "$F">"$F.out";mv "$F.out" "$F"'
请记住在最外层的sh -c
参数字符串中使用单引号,我们不希望内部的$F
被父外壳替换。