【发布时间】:2020-08-22 00:57:35
【问题描述】:
所以我使用带有正则表达式的 find 删除一些文件,然后通过管道传输到 xargs -0 rm 或简单地添加 --delete
有时,我需要从删除中排除其中一些 - 我将查找输出写入文件,删除一些行并将新行字符替换为空字符。我在 vim 中执行此操作,现在我有这个 EOF 字符,当我将它提供给删除命令时,这让我很烦恼。这是一个使用 file 而不是 rm 的非常简化的测试用例:
[testdir]$ touch t{1..3}
[testdir]$ find . -name 't*' -print0 > xa
[testdir]$ find . -name 't*' > xb
[testdir]$ cat -v xa
./t3^@./t2^@./t1^@[testdir]$ cat xb
./t3
./t2
./t1
[testdir]$ vim xb
在 vim 中,我执行 ':%s/\n/CTRL-@/' 并保存。之后,与原来的 find 输出文件相比,不想要的效果:
[testdir]$ cat -v xb
./t3^@./t2^@./t1^@
[testdir]$ xargs -a xa -0 file
./t3: empty
./t2: empty
./t1: empty
[testdir]$ xargs -a xb -0 -E '\012' file
xargs: warning: the -E option has no effect if -0 or -d is used.
./t3: empty
./t2: empty
./t1: empty
: cannot open `\012' (No such file or directory)
rm 适用于所有文件,只是最后出现错误。注意原始输出没有在末尾插入新行,请参见“cat xa”的结果。此外,xargs 告诉我,由于空分隔符,我不能排除该 EOF 字符。
我很想知道如何解决这个问题,有什么想法吗?
【问题讨论】:
-
好吧,删除输入文件中留下的换行符。
how to fix this究竟修复了什么?所有实用程序都按预期工作。你想达到什么目的?也许不是-E $'\n',而是使用另一个实用程序从换行符中删除输入中的所有内容..但是问题是,你为什么首先使用vim。 -
那是我的问题,它似乎不是一个新行。我猜这是文件字符的结尾。此外,如果它是一个新行,替换会处理它。
-
end of file character没有这样的东西。EOF不是字符。the substitution would have taken care of it- 不,vim明确强制在文件中使用尾随换行符。前任。 disable automatic newline in vim 或者只是删除尾随换行符......所以你的输入文件xb有./t3<zero>./t2<zero>./t1<zero><newline>- 当你用零分隔它时你有4个文件 -./t3./t2./t1和<newline>,因为你没有一个只命名为换行符的文件,所以没有这样的文件或目录。 -
旁注:我相信使用
tr '\n' '\0'