Bash Linux:Pipe`find`文本文件列表|`dos2unix``dd`命令
我试图做的是:Bash Linux:Pipe`find`文本文件列表|`dos2unix``dd`命令,bash,pipe,ubuntu-14.04,Bash,Pipe,Ubuntu 14.04,我试图做的是: 第1行:找到任何.txt或.txt文件并将它们导入下一个命令 第2行:将.txt文件转换为unix格式(去掉Windows行结尾) 第3行:删除文件的最后一行,该行始终为空 我无法将xargs dos2unix-k |/的(EDIToutput)文件名导入第三行,我遇到以下错误: stat: cannot stat '': No such file or directory tail: cannot open '' for reading: No such file or d
- 第1行:找到任何.txt或.txt文件并将它们导入下一个命令
- 第2行:将.txt文件转换为unix格式(去掉Windows行结尾)
- 第3行:删除文件的最后一行,该行始终为空
xargs dos2unix-k |/
的(EDIToutput)文件名导入第三行,我遇到以下错误:
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
显然,Iv'e错误地认为,“$\u”
将足以使输出通过管道
如何将输出(文本文件)从xargs dos2unix-k
导入第三行dd if=/dev/null=“$\uBS=1 seek=$(echo$(stat--format=%s“$”)-$(tail-n1“$\u124; wc-c)| bc)
第3行的解决方案来自于对关于从文件中删除最后一行的另一个问题的回答,特别是这个答案被吹捧为大文件的好解决方案:您可以尝试用显式替换来替换
dos2unix
:
find "${TEMPDIR}" -iname '*.txt' -exec cat {} \; |
tr -d '\r' |
...
由于新行的窗口是\r\n
,您可以使用命令tr
删除所有出现的\r
关于
find
命令,您可以使用选项-iname
进行不区分大小写的搜索,并使用-exec
运行命令。您可以尝试使用显式替换来替换dos2unix
:
find "${TEMPDIR}" -iname '*.txt' -exec cat {} \; |
tr -d '\r' |
...
由于新行的窗口是\r\n
,您可以使用命令tr
删除所有出现的\r
关于find
命令,您可以使用选项-iname
进行不区分大小写的搜索,并使用-exec
运行命令。这有帮助吗
find "${TEMPDIR}" -iname '*.txt' -exec dos2unix "{}" \; -exec sed -i '$d' "{}" \;
这有帮助吗
find "${TEMPDIR}" -iname '*.txt' -exec dos2unix "{}" \; -exec sed -i '$d' "{}" \;
如果文件非常大,则使用
tr
重写文件已经会影响效率。然后,您将使用tail
再次阅读它,以获取最后一行的索引
我能想到的效率最低的修复方法是用一个执行这两种功能的命令来替换dos2unix
和dd
,这样您只需读写一次输出文件
find "$TMPDIR" -iname '*.txt' -exec perl -i -ne '
print $line if defined $line; ($line = $_) =~ s/\015$//' {} \;
您试图对当前文件名使用$\uuuu
的尝试无效。$的值是上一个完成的命令使用的最后一个文件名;但在管道的中部,什么都没有完成。一种可能的解决方法(我只是为了说明,不是推荐的解决方案)是在xargs
中运行所有内容,在那里您可以访问{}
,类似于它在find-exec
中的工作方式
find "$TMPDIR" -iname '*.txt' -print0 |
xargs -r0 sh -c 'dos2unix -k "{}"
if=/dev/null of="{}" bs=1 seek=$(
echo $(stat --format=%s "{}" ) - $( tail -n1 "{}" | wc -c) | bc)
我添加了-print0
和相应的xargs-0
以及xargs-r
作为良好形式的插图;尽管以零结尾的文本格式是GNUfind
扩展,但在其他平台上通常找不到
(私下里,我可能也会用一个简单的Awk脚本来代替seek
计算,而不是花三个过程来执行减法。)如果文件真的很大,你已经在用tr
重写它,把效率搞砸了。然后,您将使用tail
再次阅读它,以获取最后一行的索引
我能想到的效率最低的修复方法是用一个执行这两种功能的命令来替换dos2unix
和dd
,这样您只需读写一次输出文件
find "$TMPDIR" -iname '*.txt' -exec perl -i -ne '
print $line if defined $line; ($line = $_) =~ s/\015$//' {} \;
您试图对当前文件名使用$\uuuu
的尝试无效。$的值是上一个完成的命令使用的最后一个文件名;但在管道的中部,什么都没有完成。一种可能的解决方法(我只是为了说明,不是推荐的解决方案)是在xargs
中运行所有内容,在那里您可以访问{}
,类似于它在find-exec
中的工作方式
find "$TMPDIR" -iname '*.txt' -print0 |
xargs -r0 sh -c 'dos2unix -k "{}"
if=/dev/null of="{}" bs=1 seek=$(
echo $(stat --format=%s "{}" ) - $( tail -n1 "{}" | wc -c) | bc)
我添加了-print0
和相应的xargs-0
以及xargs-r
作为良好形式的插图;尽管以零结尾的文本格式是GNUfind
扩展,但在其他平台上通常找不到
(私下里,我可能也会用一个简单的Awk脚本来代替seek
计算,而不是花费三个进程来执行减法。)dos2unix
程序不会产生任何输出,因此xargs dos2unix-k
也不会。它只是以静默方式转换文件。您也可以使用find-iname
进行不区分大小写的搜索。只是不要使用管道,它会在适当的位置编辑文件。使用改为code>,然后继续您的操作。dd
命令需要在您试图修改的文件上运行——您链接到的问题特别提醒了这一点。因此,它不能在管道末尾运行,因为没有可编辑的文件名。管道字符后的斜杠是语法错误。您可能打算使用反斜杠,但在这里也不需要反斜杠——shell知道管道后面没有任何内容是一个多行命令,它将在下一行继续执行。dos2unix
程序不会产生任何输出,因此xargs dos2unix-k
也不会产生任何输出。它只是以静默方式转换文件。您也可以使用find-iname
进行不区分大小写的搜索。只是不要使用管道,它会在适当的位置编辑文件。使用改为code>,然后继续您的操作。dd
命令需要在您试图修改的文件上运行——您链接到的问题特别提醒了这一点。因此,它不能在管道末尾运行,因为没有可编辑的文件名。管道字符后的斜杠是语法错误。您可能打算使用反斜杠,但在这里也不需要它们--t