найдите не проходит все файлы в структуре папок

Я хочу преобразовать крупный набор wmf файлов (120860!) к svg во многих подпапках (27 подпапок со многими подподпапками каждый). У меня есть этот сценарий удара, который делает

for i in `find -iname "*.wmf"`; do
  uniconvertor ${i} ${i%.wmf}.svg
done

но это никогда не преобразовывает все, это всегда останавливается где-нибудь в середине. Некоторые подпапки преобразовываются, некоторые не, некоторые только частично. Даже если я запускаю сценарий оболочки во всех 27 подпапках первого уровня, только часть файлов преобразовывается.

Какова могла быть проблема?

0
задан 14 February 2016 в 18:51

2 ответа

Если у Вас нет разрывов строки на названия Ваших файлов или папок, необходимо использовать while вместо for цикл:

find -iname "*.wmf" | while read file; do
    uniconvertor "$file" "${i%.wmf}.svg" 
done

Это избегает проблем с пробелами на имена и со слишком много аргументами при расширении ...

1
ответ дан 29 September 2019 в 12:13

Необходимо окружить Ваш 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.

0
ответ дан 29 September 2019 в 12:13

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

Похожие вопросы: