繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM