【发布时间】:2015-08-24 00:59:58
【问题描述】:
我正在尝试做的事情:
- 第 1 行:查找任何 .txt 或 .TXT 文件并将它们通过管道传递到下一个命令
- 第 2 行:将 .txt 文件转换为 unix 格式(去掉 Windows 行尾)
- 第 3 行:删除文件的最后一行,始终为空
find "${TEMPDIR}" -name *.[Tt][Xx][Tt] | /
xargs dos2unix -k | /
dd if=/dev/null of="$_" bs=1 seek=$(echo $(stat --format=%s "$_" ) - $( tail -n1 "$_" | wc -c) | bc )
我无法将xargs dos2unix -k | / 的 (EDIT output) 文件名传送到第三行,我收到以下错误:
stat: cannot stat '': No such file or directory
tail: cannot open '' for reading: No such file or directory
dd: failed to open '': No such file or directory
显然我错误地认为"$_" 足以通过管道传递输出。
如何将xargs dos2unix -k 的输出(文本文件)通过管道传输到第三行dd if=/dev/null of="$_" bs=1 seek=$(echo $(stat --format=%s "$_" ) - $( tail -n1 "$_" | wc -c) | bc )?
第 3 行的解决方案来自对 SO 上关于从文件中删除最后一行的另一个问题的回答,该回答特别被吹捧为大文件的良好解决方案:https://stackoverflow.com/a/17794626/893766
【问题讨论】:
-
dos2unix程序不会产生任何输出,所以xargs dos2unix -k也不会。它只是默默地转换文件。 -
您也可以使用
find -iname进行不区分大小写的搜索 -
只是不要管道它,它会在适当的位置编辑文件。请改用
;,然后继续您的工作。 -
dd命令需要在您尝试修改的文件上运行——您链接到的问题特别注意这一点。因此,它不能在管道末尾运行,因为没有要编辑的文件名。 -
管道字符后的斜线是语法错误。您可能打算使用反斜杠,但在这里它们也不是必需的——shell 知道后面没有任何内容的管道是一个多行命令,它将在下一行继续。
标签: bash pipe ubuntu-14.04