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

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

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

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 {} + 
  • Несколько приложений, которые записывают один и тот же файл в общем разделе NFS
  • Разрешить перемещение, но не помещать в inner-sftp
  • Переключить символическую ссылку и каталог
  • Добавить расширение файла к существующему (MIME) типу
  • Bash: сортировка элементов массива по дате файла
  • обрабатывать файлы в каталоге по мере их появления
  • Как сделать секвенцию имен файлов с помощью циклов
  • rsync самая последняя папка
  • Вывод общих строк из 2-х файлов и необычных строк из обоих файлов в один выходной файл
  • Следить за всеми файлами, доступными для определенного процесса?
  • Как добавить атрибут в тег в файле XML по командной строке?
  • Interesting Posts

    Какой самый безопасный (или самый элегантный или самый короткий) способ изменить в каталог, откуда вызывается скрипт?

    Как узнать, какие процессы были запущены?

    Как вступить в силу команда `usermod` без выхода из системы и входа в систему

    Символы цитирования персонажей

    Как узнать, какой процесс использует веб-камера V4L2?

    Настройка зашифрованного свопа в LMDE (debian)

    Почему xsetwacom не работает с udev?

    Отправлять письма на Ubuntu 16.04 – Не удалось выполнить аутентификацию на SMTP-сервере с именем пользователя, используя 3 возможных аутентификатора

    Является ли Ramdisk и initrd одинаковыми?

    Где я могу найти драйвер Linux для наушников в дереве ядра?

    Имеет ли TMUX модульные тесты или набор тестов?

    Работа с пробелами переменных для `mv`

    Недопустимое значение «ошибка» с плавающей запятой c-shell

    RVM + TMUX-Повторяющиеся записи в $ PATH

    Ошибка mount.cifs (2): нет такого файла или каталога при использовании префикса

    Linux и Unix - лучшая ОС в мире.