我在一个目录中有一堆xml文件,需要对它们执行dos2unix命令,并且会经常添加新文件。我不想每次都在每个文件上手动执行dos2unix命令,而是想用一个脚本自动完成这一切。我从来没有看过shell脚本,但到目前为止,我从一些教程中读到了以下内容:
FILES=/tmp/testFiles/*
for f in $FILES
do
fname=`basename $f`
dos2unix *.xml $f $fname
done然而,我总是得到'usage‘的输出。我认为问题是我没有正确地分配新文件的名称(fname)。
发布于 2012-07-02 19:31:12
您收到用法消息的原因是dos2unix不接受您提供的额外参数。然而,它将接受多个文件名(也通过globs)。您不需要循环,除非您要处理的文件超过了命令行所能接受的数量。
dos2unix /tmp/testFiles/*.xml这应该是您需要的全部内容,除非您需要递归:
find /tmp/testFiles -name '*.xml' -exec dos2unix {} +(用于GNU查找)
发布于 2012-07-02 19:22:25
如果所有文件都在一个目录中(不需要递归),那么就差不多了。
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,但您的意图并不明确。稍后,在注释中,您说您只想覆盖这些文件。我的解决方案执行转换,不创建备份,并用转换后的版本覆盖原始版本。我希望这是你的意图。
发布于 2012-07-02 18:43:10
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.xmlhttps://stackoverflow.com/questions/11292010
复制相似问题