Найдите файлы, переименуйте их с помощью «uuidgen» и добавьте расширение

У меня есть список файлов в определенной папке без extenstion. Я хочу переименовать их и добавить расширение. Имя должно быть UUID. Я знаю, как их найти, и есть утилита «uuidgen» для генерации UUID, как я могу сделать все остальное?

find . -type f -name 'file*' # ??? -exec .... ??? 

  • Как воспроизводятся Flash-видео?
  • Восстановление пространства из одной файловой системы, чтобы передать его другому без LVM
  • Можно ли игнорировать скрытые файлы Windows?
  • Linux разделяет отдельные файлы на диске, но видит как один
  • Возможно ли создать «файл», который может быть использован любым процессом без фактического сохранения файла на диске?
  • Режим файла на MacOSX
  • У меня есть список файлов - результат команды find, как я могу использовать его для zip / tar файлов и удалять исходные файлы
  • создание последовательности чисел, по одной в строке в файле
  • One Solution collect form web for “Найдите файлы, переименуйте их с помощью «uuidgen» и добавьте расширение”

    Пытаться:

     find . -type f -name 'file*' -execdir sh -c 'mv "$1" "$(uuidgen).ext"' Renamer {} \; 

    Как это работает

    • find . -type f -name 'file*' -execdir ... \;

      Эта часть, с которой вы, похоже, знакомы: находит файлы, имена которых соответствуют file* glob file* и запускает команду ... на них, где в нашем случае ... заменяется на:

    • sh -c 'mv "$1" "$(uuidgen).ext"' Renamer {}

      Это запускает оболочку, запускает команду mv и делает имя файла доступным как $1 . ( Renamer – это произвольная строка, которую оболочка назначает $0 которую оболочка будет использовать, если она генерирует сообщение об ошибке.) Команда find заменяет {} именем имени файла, который он нашел, и это то, что оболочка назначает $1 . Давайте посмотрим на команду оболочки:

    • mv "$1" "$(uuidgen).ext"

      Это переименовывает файл из $1 в имя, созданное uuidgen .

      Поскольку имя файла может содержать пробелы или другие сложные символы, мы помещаем $1 в двойные кавычки, чтобы защитить имя от разделения слов или расширений оболочки.

    Мы использовали -execdir вместо -exec по двум причинам:

    1. Это упрощает команду mv : он не требует дополнительного кода, чтобы убедиться, что переименованный файл остается в одном каталоге.

    2. -execdir более безопасен: если каталог был переименован во время выполнения команды find , -exec , но не -execdir , может -execdir неудача.

    Зачем начинать новую оболочку?

    Может возникнуть соблазн попытаться использовать:

     find . -type f -name 'file*' -execdir mv {} "$(uuidgen).ext" \; # Don't do this 

    Проблема здесь в том, что uuidgen будет запускаться только один раз. Оболочка запускает uuidgen прежде чем он даже начнет команду find . Как следствие, все команды mv будут иметь одинаковое имя целевого файла. Мы хотим, чтобы uuidgen запускался один раз для каждого файла, найденного с помощью find . Вот почему нам нужно запустить mv и uuidgen под командой sh .

    Более эффективная версия

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

     find . -type f -name 'fi*' -execdir sh -c 'for f; do mv "$f" "$(uuidgen).ext"; done' Renamer {} + 
    Linux и Unix - лучшая ОС в мире.