Как случайным образом назвать файл при использовании find exec в bash-скрипте? - PullRequest
0 голосов
/ 04 марта 2019

Когда дело доходит до быстрого преобразования группы файлов и случайного их переименования, я использую довольно простой способ сделать это с помощью цикла for:

for i in *; do convert [...] $i ../output/$RANDOM.jpg; done

Просто так.Детали, которые здесь делает imagemagick, здесь не важны.Работает как задумано.Это просто способ работы с bash.

Теперь в моем текущем случае папка не только содержит фотографии, но и сама содержит подпапки с другими фотографиями.Снова ожидается, что все фотографии случайным образом переименовываются, а выходные файлы объединяются в одну папку.

Поскольку я не знаю способа рекурсивного цикла с for, здесь я использую конструкцию find.

find . \( -iname "*.jpg" -or -iname "*.png" \) -exec convert [...] {} ../output/$RANDOM.jpg  \;

Проблема в том, что $ RANDOM вызывается только один раз , поэтому он остается неизменным на протяжении всего процесса, и изображения перезаписываются снова и снова.Так что на самом деле выходная папка делает только одно изображение, то, которое было обработано последним.

Итак, вопрос: Как получить переменную $ RANDOM для изменения при каждом новом файле?

С уважением!

Ответы [ 3 ]

0 голосов
/ 04 марта 2019

Не используйте find вообще;просто используйте опцию globstar.

shopt -s globstar
for f in **/*.jpg **/*.png; do
  convert [...] "$i" ../output/$RANDOM.jpg
done
0 голосов
/ 04 марта 2019

Я бы пошел с циклом оболочки, как подробно описано в других ответах, но все же полезно знать, как запустить произвольный код оболочки, такой как $RANDOM, в команде find -exec.Вы делаете это, запустив оболочку:

find . \( -iname "*.jpg" -or -iname "*.png" \) \
    -exec bash -c 'convert [...] "$1" "../output/$RANDOM.jpg"' _ {} \;
0 голосов
/ 04 марта 2019

Бросьте его в цикл.

find . \( -iname "*.jpg" -or -iname "*.png" \) -type f -print0 |
  while read -d '' -r f 
  do convert [...] "$f" ../output/$RANDOM.jpg  # copied mostly from your find above
  done

-print0 и read -d '' не нужны, если вы никогда не вставляете символы новой строки в свои имена файлов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...