find не просматривает все файлы в структуре папок
Я хочу преобразовать массив wmf файлов (120860!) В svg во многих подпапках (27 подпапок со многими подпапками в каждом). У меня есть скрипт bash, который делает
for i in `find -iname "*.wmf"`; do
uniconvertor ${i} ${i%.wmf}.svg
done
но он никогда не преобразует все, он всегда останавливается где-то посередине. Некоторые подпапки конвертируются, некоторые нет, некоторые только частично. Даже если я запускаю сценарий оболочки во всех 27 подпапках первого уровня, конвертируется только часть файлов.
В чем может быть проблема?
2 ответа
Если у вас нет разрывов строк в именах ваших файлов или папок, вы должны использовать 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
,
Читать 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.