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

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

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

  • Запустить команду на одноименные файлы из нескольких каталогов
  • найти команду, перечислить вывод и разрешить выбор?
  • Отображение количества байтов, слов и строк в файле
  • Найти изображения по размеру: find / file / awk
  • Перенаправление / grep'ing STDOUT существующей оболочки
  • Должен ли я ставить старые проекты в tarballs
  • Создание множества файлов со случайным контентом
  • Команда, которая удаляет все старые файлы, папки и подпапки
  • 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 - лучшая ОС в мире.