Пакетное переименование файлов
Я хочу, чтобы переименовать несколько файлов в каталоге, чтобы предыдущее число и hypen были удалены из имени файла.
Old file name: 2904495-XXX_01_xxxx_20130730235001_00000000.NEW
New file name: XXX_01_xxxx_20130730235001_00000000.NEW
Как это сделать с помощью команды linux?
Ответы
Ответ 1
Это должно сделать это:
rename 's/^[0-9]*-//;' *
Он получает от начала блок [0-9]
(то есть числа) много раз, затем дефис -
и удаляет его из имени файла.
Если rename
не находится на вашем компьютере, вы можете использовать цикл и mv
:
mv "$f" "${f#[0-9]*-}"
Test
$ ls
23-aa hello aaa23-aa
$ rename 's/^[0-9]*-//;' *
$ ls
aa hello aaa23-aa
Или:
$ ls
23-a aa23-a hello
$ for f in *;
> do
> mv "$f" "${f#[0-9]*-}"
> done
$ ls
a aa23-a hello
Ответ 2
Я думаю, что эта команда будет лучше, если вы выполните следующую команду:
ls * | sed -e 'p;s/old-name/new-name/' | xargs -n2 mv
Здесь
ls * - список файлов в текущей папке
sed -e - выполняет выражение
p; - печатает старое имя файла
s/old-name/new-name/ - создать новое имя файла
xargs -n2 - обрабатывает два аргумента для mv
mv - получает два параметра и выполняет операцию перемещения
Рекомендация: перед выполнением mv проверьте, что вы делаете, это то, чего вы хотите достичь с помощью эха.
ls * | sed -e 'p;s/old-name/new-name/' | xargs -n2 echo
В следующем примере переименовываются
SCCF099_FG.gz5329223404623884757.tmp
SCCF099_FG.gz
ls *tmp | sed -e 'p;s/\([0-9]\)\+\.tmp/ /g' | xargs -n2 echo
ls *tmp | sed -e 'p;s/\([0-9]\)\+\.tmp/ /g' | xargs -n2 mv
Ответ 3
Если первые числа всегда имеют одинаковую длину:
for F in *new ; do
mv $F ${F:8}
done
${parameter:number}
выполняет расширение подстроки - принимает строку, начинающуюся с 8-го символа.
В расширениях доступно множество других редактирований строк для обработки других случаев.
Ответ 4
используя renamer (Windows, Mac и Linux):
$ renamer --regex --find '\d+-(.*)' --replace '$1' *
Это приведет к удалению всех чисел и первого дефиса с начала всех файлов в текущем каталоге.
Ответ 5
vimv позволяет переименовывать несколько файлов с помощью возможностей редактирования текста Vim.
Ввод vimv открывает окно Vim, в котором перечислены все файлы, и вы можете выполнять сопоставление образцов, визуальный выбор и т.д., чтобы редактировать имена. После выхода из Vim файлы будут переименованы.
screencast в файле README показывает, как он решает вопрос с оригинальным плакатом.
[Отказ от ответственности: я автор этого инструмента]
Ответ 6
Это может показаться немного сложным, но оно довольно эффективно и хорошо работает на системах * nix и OSX. Он также действует рекурсивно, переименовывая файлы в текущем каталоге, а также в любых подкаталогах:
find . -regex '.*/[0-9]\{7\}[-].*' -print > temp1 && \
cp temp1 temp2 && \
vi -c ":g/\([0-9]\{7\}[-]\)\(.*\)/s//\2/" -c ":x" temp2 && \
paste temp1 temp2 > temp3 && \
vi -c ":g/^/s//mv /" -c ":x" temp3 && \
sh ./temp3 && \
rm temp1 temp2 temp3
Вот разбивка того, что только что произошло:
В первой строке указано, что все файлы (find
) находятся на всех файлах, начиная с тех, которые находятся в текущем каталоге (.
), чье имя соответствует шаблону (-regex
) из 7 номеров, а затем тире, за которым следует 0 или более символов "('.*/[0-9]\{7\}[-].*'
), и напишите эти имена файлов и их соответствующие пути (-print
) в файл под названием temp1 (> temp1
). Обратите внимание, что директива -print
, вероятно, не нужна в большинстве случаев, но это ничего не должно повредить.
find . -regex '.*/[0-9]\{7\}[-].*' -print > temp1 && \
Затем скопируйте (cp
) содержимое temp1 в файл под названием temp2.
cp temp1 temp2 && \
Затем откройте файл temp2 с помощью текстового редактора vi и дайте vi две команды (используя -c
для обозначения каждой новой команды):
- Команда # 1:
- Найдите каждую строку temp2 (
:g
) для того же шаблона, который мы искали выше, за исключением этой группы времени результаты с помощью круглых скобок (\([0-9]\{7\}[-]\)\(.*\)
).
- Для каждой подходящей строки переместите курсор туда, где было найдено совпадение, и замените целое совпадение только второй группой совпадающего шаблона (
\2
).
- Команда # 2:
- Сохраните изменения, внесенные в temp2, и закройте файл (
:x
).
Результат:
vi -c ":g/\([0-9]\{7\}[-]\)\(.*\)/s//\2/" -c ":x" temp2 && \
Теперь соедините строки из temp1 с параметрами temp2 (paste
) и напишите каждую новую комбинированную строку в файл temp3 (> temp3
).
paste temp1 temp2 > temp3 && \
Затем запустите vi, выполнив те же действия, что и выше, за исключением этого поиска по времени для начала каждой строки (^
) внутри файла temp3 и добавьте mv и одно место сразу после него (mv
).
vi -c ":g/^/s//mv /" -c ":x" temp3 && \
Затем выполните содержимое temp3 (./temp3
) в качестве оболочки script (sh
).
sh ./temp3 && \
Наконец, удалите (rm
) каждый из временных файлов, которые мы создали в течение всего процесса.
rm temp1 temp2 temp3
Ответ 7
Вы можете использовать этот инструмент: rnm
Код, чтобы сделать то, что вы хотите:
rnm /path/to/the/directory -fo -dp -1 -rs '/^\d+-//' -ss '^\d+-'
-fo
предназначен только для режима файла
-dp
- глубина директории (-1
означает неограниченную глубину).
-rs
заменяет строку. \d+-
regex заменяется пустой строкой.
-ss
- это строка поиска, она ищет файлы с ^\d+-
regex. (Это может быть опущено, хотя на экране будут напечатаны некоторые безобидные сообщения об ошибках).
Ответ 8
Мне действительно нравится что-то вроде "переименовать *.mp3 *.mp4".
Но ни один из других ответов не дал мне этого. Поэтому я написал программу haskell для этого.
https://hackage.haskell.org/package/batch-rename
С этим вы можете сделать:
batch_rename "DCIM *.jpg" "*.png"
Ответ 9
Существует также удобный инструмент GUI pyRenamer
https://wiki.ubuntuusers.de/pyRenamer/