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.

Другие вопросы по тегам