Я хочу изменить строку типа автор - имя
в именах файлов некоторых книг на имя - автор
. Я пытаюсь
ls * | sed -r 's/(.+) - (.+).pdf/mv \2 - \1.pdf/' | sh
Возможно, это смесь из. Поменять местами две строки произвольной длины, разделенные символом Переименовать несколько файлов с помощью sed
Это не работает
for file in *; do mv "$file" "$(echo "$file" | sed -r 's/(.+) - (.+).pdf/\2 - \1.pdf/')"
Не работает
rename 's/\([.]+\) - \([.]+\)\.pdf/\2 - \1\.pdf/' *
Это работает
rename 's/(.+) - (.+).pdf/\2 - \1.pdf/' *
% ls -1
001-foobar.pdf
002-foobar.pdf
003-foobar.pdf
% rename -n 's/([^-]+)-([^\.]+)\.pdf/$2-$1.pdf/' *.pdf
001-foobar.pdf -> foobar-001.pdf
002-foobar.pdf -> foobar-002.pdf
003-foobar.pdf -> foobar-003.pdf
(удалите ключ -n, когда ваши тесты в порядке)
Есть и другие инструменты с тем же именем, которые могут делать или не делать это, так что будьте осторожны.
Если вы выполните следующую команду (GNU
)
$ file "$(readlink -f "$(type -p rename)")"
и получите результат, подобный
.../rename: Perl script, ASCII text executable
а не содержащий:
ELF
то, похоже, это правильный инструмент =)
Если нет, то чтобы сделать его по умолчанию (обычно это уже так) на Debian
и производных типа Ubuntu
:
$ sudo update-alternatives --set rename /path/to/rename
(замените /path/to/rename
на путь вашей perl'овской команды rename
.
Если у вас нет этой команды, поищите в менеджере пакетов, чтобы установить ее или сделайте это вручную
И последнее, но не менее важное: этот инструмент был первоначально написан Ларри Уоллом, отцом Perl.
Я предполагаю, что имена файлов соответствуют шаблону author - name.pdf
и что и author
, и name
могут содержать любой допустимый символ, кроме -
, окруженного пробелами.
find. -type f -name '* - *.pdf' \
-execdir sh -c 'b=${1% - *}; e=${1#* - }; mv "$1" "${e%.pdf} - $b.pdf"' sh {} \;
Это находит все обычные файлы в текущем каталоге, имена которых соответствуют шаблону * - *.pdf
.
Для каждого такого файла выполняется подоболочка. Подоболочка делает следующее:
b=${1% - *} # pick out the start of the filename
e=${1#* - } # pick out the end of the filename
# Combine $b and $e into a new filename while removing ".pdf" from
# the end of the original filename and adding it to the end of
# the new filename instead.
mv "$1" "${e%.pdf} - $b.pdf"
Проверка:
$ ls -l
total 0
-rw-r--r-- 1 kk wheel 0 Aug 30 11:31 arr! - Boaty McBoatface.pdf
-rw-r--r-- 1 kk wheel 0 Aug 30 11:30 hello world - bingo-night!.pdf
$ find. -type f -name '* - *.pdf' -execdir sh -c 'b=${1% - *}; e=${1#* - }; mv "$1" "${e%.pdf} - $b.pdf"' sh {} \;
$ ls -l
total 0
-rw-r--r-- 1 kk wheel 0 Aug 30 11:31 Boaty McBoatface - arr!.pdf
-rw-r--r-- 1 kk wheel 0 Aug 30 11:30 bingo-night! - hello world.pdf
При повторном запуске имена вернутся к исходным.