[英]How to automate dos2unix using shell script?
我在一个目录中有一堆xml文件需要对它们执行dos2unix命令,并且每隔一段时间就会添加新文件。 我不是每次都在每个文件上手动执行dos2unix命令,而是希望使用脚本自动完成所有这些操作。 在我的生活中,我甚至都没有看过shell脚本,但到目前为止,我从一些教程中读到了这些内容:
FILES=/tmp/testFiles/*
for f in $FILES
do
fname=`basename $f`
dos2unix *.xml $f $fname
done
但是我一直在显示'使用'输出。 我认为问题是我没有正确分配新文件的名称(fname)。 谁能帮忙。
谢谢,艾伦
您收到使用消息的原因是dos2unix
没有采用您提供的额外参数。 但是,它会接受多个文件名(也可以通过globs)。 除非您处理的文件多于命令行上可接受的文件,否则不需要循环。
dos2unix /tmp/testFiles/*.xml
应该是你需要的,除非你需要递归:
find /tmp/testFiles -name '*.xml' -exec dos2unix {} +
(对于GNU查找)
如果所有文件都在一个目录中(不需要递归),那么你几乎就在那里。
for file in /tmp/testFiles/*.xml ; do
dos2unix "$file"
done
默认情况下, dos2unix
应该就地转换并覆盖原始。
如果需要递归,你还必须使用find
:
find /tmp/testFiles -name '*.xml' -print0 | while IFS= read -d '' file ; do
dos2unix "$file"
done
这将适用于/tmp/testFiles/
及其所有子目录中以.xml
结尾的所有文件。
如果不需要其他步骤,您可以完全跳过shell循环:
非递归:
find /tmp/testFiles -maxdepth 1 -name '*.xml' -exec dos2unix {} +
对于递归:
find /tmp/testFiles -name '*.xml' -exec dos2unix {} +
在您的原始命令中,我看到您找到每个文件名的基本名称并尝试将其传递给dos2unix
,但您的意图并不明确。 稍后,在评论中,您说您只想覆盖这些文件。 我的解决方案执行转换,不创建备份并使用转换后的版本覆盖原始文件。 我希望这是你的意图。
mkdir /tmp/testFiles/converted/
for f in /tmp/testFiles/*.xml
do
fname=`basename $f`
dos2unix $f ${f/testFiles\//testFiles\/converted\/}
# or for pure sh:
# dos2unix $f $(echo $f | sed s@testFiles/@testFiles/converted/@)
done
结果将保存在converted/
子目录中。
构造${f/testFiles\\//testFiles\\/converted\\/}
(感谢Rush )或sed
用于在文件名前添加converted/
:
$ echo /tmp/testFiles/1.xml | sed s@testFiles/@testFiles/converted/@
/tmp/testFiles/converted/1.xml
目前尚不清楚您正在使用dos2unix的哪个实现。 不同实现需要不同的参数。 有很多不同的实现。
在RedHat / Fedora / Suse Linux上你可以输入
dos2unix /tmp/testFiles/*.xml
在SunOS上,您需要提供输入和输出文件名,上述命令将销毁您的几个文件。
你使用的是哪个版本?
问候,欧文
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.