Как автоматизировать dos2unix, используя скрипт?

У меня есть куча xml-файлов в каталоге, которые должны иметь команду dos2unix, выполняемую на них, и новые файлы будут добавляться так часто. Я вместо того, чтобы вручную выполнять команду dos2unix для каждого файла каждый раз, когда я хотел бы автоматизировать все это со скриптом. Я никогда даже не смотрел на сценарий оболочки в моей жизни, но до сих пор у меня есть это из того, что я прочитал в нескольких учебниках:

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

однако я продолжаю получать вывод "использование". Я думаю проблема в том, что я неправильно назначаю имя нового файла (fname). Может кто-нибудь помочь.

спасибо, Алан!--2-->

4 ответов


причина, по которой вы получаете сообщение об использовании, заключается в том, что dos2unix не принимает дополнительные аргументы, которые вы предоставляете. Однако он будет принимать несколько имен файлов (также через globs). Вам не нужен цикл, если вы не обрабатываете больше файлов, чем может быть принято в командной строке.

dos2unix /tmp/testFiles/*.xml

должно быть все, что вам нужно, если вам нужна рекурсия:

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

(для GNU find)


если все файлы находятся в одном каталоге (рекурсия не требуется), то вы почти там.

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/ и все его подкаталоги.

если никакой другой шаг не требуется, вы можете пропустить петля раковины полностью:

нерекурсивный:

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\/} (спасибо пик) или 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 вы должны дать имя входного и выходного файла, и вышеуказанная команда уничтожит несколько ваших файлов.

какую версию вы используете?

С уважением, Эрвин!--2-->