我在一个目录中有一堆xml文件需要对它们执行dos2unix命令,并且每隔一段时间就会添加新文件。我不是每次都在每个文件上手动执行dos2unix命令,而是希望使用脚本自动完成所有这些操作。在我的生活中,我甚至从未查看过shell脚本,但到目前为止,我从一些教程中读到了这些内容:
FILES=/tmp/testFiles/*
for f in $FILES
do
fname=`basename $f`
dos2unix *.xml $f $fname
done
但是我一直在显示'使用'输出。我认为问题是我没有正确分配新文件的名称(fname)。任何人都可以提供帮助。
谢谢, 艾伦
答案 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上,您需要提供输入和输出文件名,上述命令会破坏您的几个文件。
您使用的是哪个版本?
的问候, 欧文