Переименуйте файлы с последовательными номерами, сохраняя оригинальное имя файла - PullRequest
0 голосов
/ 05 ноября 2018

Я получил кучу mp3-файлов со случайными именами и числами, такими как:

  • 01_fileabc.mp3
  • 01.filecdc.mp3
  • fileabc.mp3
  • 929-audio.mp3

Для сортировки мне нужно добавить порядковый номер перед именем файла, например:

  • 001_01_fileabc.mp3
  • 002_01.filecdc.mp3
  • 003_fileabc.mp3
  • 004_929-audio.mp3

Я проверил некоторые решения, которые нашел здесь . Одно из первых решений работало, но заменяло имя файла, а не добавляло к нему.

num=0; for i in *; do mv "$i" "$(printf '%04d' $num).${i#*.}"; ((num++)); done

Как я могу изменить эту команду, чтобы вместо нее добавить имя файла? Прошу прощения, но что бы я ни пытался, я не могу сам найти решение здесь.

Ответы [ 3 ]

0 голосов
/ 05 ноября 2018

Вы можете попробовать это ...

$ ls -l
total 4
-rw-r--r-- 1 plankton None 5 Nov  4 13:35 01.filecdc.mp3
-rw-r--r-- 1 plankton None 5 Nov  4 13:35 01_fileabc.mp3
-rw-r--r-- 1 plankton None 5 Nov  4 13:35 929-audio.mp3
-rw-r--r-- 1 plankton None 5 Nov  4 13:35 fileabc.mp3

$ t=0
$ for i in *mp3
> do
>     # Use the seq command to get a formatted zero filled string.
>     prefix=$(seq -f "%04g" $t $t)
>
>     # Move $i to new file name.
>     mv $i ${prefix}_${i}
>
>     # Increment our counter, t.
>     t=$(expr $t + 1)
> done


$ ls -l
total 4
-rw-r--r-- 1 plankton None 5 Nov  4 13:35 0000_01.filecdc.mp3
-rw-r--r-- 1 plankton None 5 Nov  4 13:35 0001_01_fileabc.mp3
-rw-r--r-- 1 plankton None 5 Nov  4 13:35 0002_929-audio.mp3
-rw-r--r-- 1 plankton None 5 Nov  4 13:35 0003_fileabc.mp3
0 голосов
/ 05 ноября 2018

ОБНОВЛЕНИЕ: Поскольку RobC прокомментировал этот ответ, существующие пробельные символы или символы новой строки могут вызвать проблемы с перечислением файлов из-за использования команды ls с массивами bash. Таким образом, приведенный выше код может быть улучшен таким образом

#!/bin/bash
i=0
for file in *.mp3; do
    i=$((i+1))
    mv "$file" "$(printf "%03d_%s" "$i" "$file")"
done

ОРИГИНАЛЬНЫЙ ОТВЕТ: Вы можете попробовать этот код в bash-скрипте. Не забудьте сделать его исполняемым с $ chmod +x script.sh.

#!/bin/bash
contents_dir=($(ls *.mp3))
for file in ${!contents_dir[*]}; do
    new=$(awk -v i="$file" -v cd="${contents_dir[$file]}" 'BEGIN {printf("%03d_%s", i+1, cd)}')
mv ${contents_dir[$file]} $new
done

Будет добавлен последовательный 0-значный номер дерева, как вы хотели, ко всем mp3-файлам, найденным в каталоге, где выполняется сценарий.

0 голосов
/ 05 ноября 2018

Просто замените ${i#*.} (что означает «Удалить из $ i слева до первой точки) на $i, которое является исходным именем файла (я бы, вероятно, использовал $filename, $oldfile или не менее $f вместо $i в качестве имени переменной).

Вы также можете заменить . перед ним _, в противном случае файлы будут называться

0001.01_fileabc.mp3

и т.д.

...