Я хочу преобразовать крупный набор wmf файлов (120860!) к svg во многих подпапках (27 подпапок со многими подподпапками каждый). У меня есть этот сценарий удара, который делает
for i in `find -iname "*.wmf"`; do
uniconvertor ${i} ${i%.wmf}.svg
done
но это никогда не преобразовывает все, это всегда останавливается где-нибудь в середине. Некоторые подпапки преобразовываются, некоторые не, некоторые только частично. Даже если я запускаю сценарий оболочки во всех 27 подпапках первого уровня, только часть файлов преобразовывается.
Какова могла быть проблема?
Если у Вас нет разрывов строки на названия Ваших файлов или папок, необходимо использовать while
вместо for
цикл:
find -iname "*.wmf" | while read file; do
uniconvertor "$file" "${i%.wmf}.svg"
done
Это избегает проблем с пробелами на имена и со слишком много аргументами при расширении ...
Необходимо окружить Ваш find ...
команда с $( )
для замены выводом, таким образом:
for i in $( find . -type f -iname '*.wmv` ) ; do ...
Однако Вы заставляете Bash производить (и хранилище внутренне) список 120 860 имен файлов перед обработкой первого. Также (Вы не описали формат имен файлов), эта техника не справляется с именами файлов с Пробелами в них, например, A Big File.wmf
.
Read man find
, особенно, приблизительно --print0
, читал man xargs
, особенно приблизительно -0
, считал man bash
и переносит Вашу команду в сценарий, который работает uniconverter
на каждом из его аргументов, и используйте что-то как:
find . -type f -iname '*.wmv' -print0 | xargs -0 thescript
убедиться читать man bash
и очень знать о любых Пробелах в Ваших именах файлов.
@steeldriver: TQ для указания на мою ошибку. Чтение man bash
шоу:
Enclosing characters in double quotes preserves the literal value of
all characters within the quotes, with the exception of $, `, \, and,
when history expansion is enabled, !. The characters $ and ` retain
their special meaning within double quotes. The backslash retains its
special meaning only when followed by one of the following characters:
$, `, ", \, or <newline>. A double quote may be quoted within double
quotes by preceding it with a backslash.
, Таким образом, я сверхволновался о расширении Shell.