Как переименовать несколько имен файлов, включая подпапки?

Как переименовать несколько имен файлов, включая подпапки?

Например, у меня есть следующие файлы:

./dirA/fileA.png
./dirA/fileB.png
./dirA/fileC.png
./dirB/fileD.png
./dirB/fileE.png
./dirB/dirC/fileF.png

Существует ли какая-либо однострочная команда или скрипт для переименования имени файла следующим образом?

./dirA/[email protected]
./dirA/[email protected]
./dirA/[email protected]
./dirB/[email protected]
./dirB/[email protected]
./dirB/dirC/[email protected]

решение1

Пытаться:

find . -type f -name '*.png' -execdir bash -c 'mv "$1" "${1%.png}@2x.png"' Move {} \;
  • find .

    Начнется поиск файлов в текущем каталоге.

  • -type f

    Это ограничивает поиск обычными файлами.

  • -name '*.png'

    Это ограничивает поиск файлами, имена которых заканчиваются на .png.

  • -execdir bash -c '...' Move {} \;

    Это запускает команду в одинарных кавычках с $0назначенным Moveи $1назначенным имени файла, который был найден. В нашем случае команда в одинарных кавычках выглядит так:

  • mv "$1" "${1%.png}@2x.png"

    Это переименовывает файл так, чтобы он заканчивался на @2x.png. Конструкция ${1%.png}удаляет .pngиз конца имени файла. Таким образом, ${1%.png}@2x.pngзаменяет .pngв конце имени файла на @2x.png.

Пример

Начнем с каталогов с этими файлами:

$ find .
.
./dirA
./dirA/fileA.png
./dirA/fileC.png
./dirA/fileB.png
./dirB
./dirB/fileE.png
./dirB/dirC
./dirB/dirC/fileF.png
./dirB/fileD.png

Теперь давайте выполним нашу команду:

$ find . -type f -name '*.png' -execdir bash -c 'mv "$1" "${1%.png}@2x.png"' Move {} \;

После выполнения команды у нас теперь есть следующие файлы:

$ find .
.
./dirA
./dirA/[email protected]
./dirA/[email protected]
./dirA/[email protected]
./dirB
./dirB/dirC
./dirB/dirC/[email protected]
./dirB/[email protected]
./dirB/[email protected]

Связанный контент