如何使用shell脚本自动化dos2unix?

时间:2012-07-02 10:39:33

标签: bash shell dos2unix

我在一个目录中有一堆xml文件需要对它们执行dos2unix命令,并且每隔一段时间就会添加新文件。我不是每次都在每个文件上手动执行dos2unix命令,而是希望使用脚本自动完成所有这些操作。在我的生活中,我甚至从未查看过shell脚本,但到目前为止,我从一些教程中读到了这些内容:

FILES=/tmp/testFiles/*
for f in $FILES
do
  fname=`basename $f`
  dos2unix *.xml $f $fname
done

但是我一直在显示'使用'输出。我认为问题是我没有正确分配新文件的名称(fname)。任何人都可以提供帮助。

谢谢, 艾伦

4 个答案:

答案 0 :(得分:6)

您收到使用消息的原因是dos2unix不接受您提供的额外参数。但是,它会接受多个文件名(也可以通过globs)。除非您处理的文件多于命令行上可接受的文件,否则不需要循环。

dos2unix /tmp/testFiles/*.xml

除非您需要递归,否则应该是您所需要的:

find /tmp/testFiles -name '*.xml' -exec dos2unix {} +

(对于GNU查找)

答案 1 :(得分:2)

如果所有文件都在一个目录中(不需要递归),那么你几乎就在那里。

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

哪个文件适用于.xml及其所有子目录中以/tmp/testFiles/结尾的所有文件。

如果不需要其他步骤,您可以完全跳过shell循环:

非递归:

find /tmp/testFiles -maxdepth 1 -name '*.xml' -exec dos2unix {} +

对于递归:

find /tmp/testFiles -name '*.xml' -exec dos2unix {} +

在原始命令中,我看到您找到每个文件名的基本名称并尝试将其传递给dos2unix,但您的意图并不明确。稍后,在评论中,您说您只想覆盖这些文件。我的解决方案执行转换,不创建备份并使用转换后的版本覆盖原始文件。我希望这是你的意图。

答案 2 :(得分:1)

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

答案 3 :(得分:0)

目前尚不清楚您正在使用dos2unix的哪个实现。不同实现需要不同的参数。围绕着许多不同的实现。

在RedHat / Fedora / Suse Linux上,您只需输入

即可
    dos2unix /tmp/testFiles/*.xml

在SunOS上,您需要提供输入和输出文件名,上述命令会破坏您的几个文件。

您使用的是哪个版本?

的问候, 欧文