
Например, у меня есть следующие файлы:
./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]