Поменять местами две строки, разделенные символом, в нескольких именах файлов каталога

Поменять местами две строки, разделенные символом, в нескольких именах файлов каталога

Я хочу изменить строку, например, author - nameв именах файлов некоторых книг, на name - author. Я пытаюсь

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/' *

решение1

Попробуй это

% 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's renameкоманды.


Если у вас нет этой команды, найдите ее в менеджере пакетов, чтобы установить, илисделать это вручную


И последнее, но не менее важное: этот инструмент изначально был написан Ларри Уоллом, отцом Perl.

решение2

Я предполагаю, что имена файлов следуют шаблону 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

Повторный запуск вернет имена к первоначальным.

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