Как автоматизировать 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-->