Форум русскоязычного сообщества Ubuntu


Хотите сделать посильный вклад в развитие Ubuntu и русскоязычного сообщества?
Помогите нам с документацией!

Автор Тема: Bash скрипт для пакетного переименования файлов  (Прочитано 2234 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Magic Moment

  • Автор темы
  • Новичок
  • *
  • Сообщений: 4
    • Просмотр профиля
Всем доброго времени суток. На форуме есть много похожих тем, но нужного я для себя так и не нашел.
Нужен bash-скрипт, который будет добавлять перед именем каждого файла в одной конкретной папке рандомную цифру от 1 до 10000.
Например, если в папке лежат файлы с названием
file1
file2
file3
file4
file5

то после выполнения скрипта они должны стать примерно такими:

1231-file1
4625-file2
0013-file3
1211-file4
9776-file5

Оффлайн zg_nico

  • Заслуженный пользователь
  • Почётный модератор
  • Старожил
  • *
  • Сообщений: 3513
  • Nil mortalibus arduum est
    • Просмотр профиля
нужного я для себя так и не нашел
Странно. А оно-таки есть. Только надо случайное число добавить вместо счётчика, и будет ровно то, что Вам надо:SAVEIFS=$IFS; UP=10000; IFS=$'\n'; L=($( find ./ -type f )); for (( i=0; i<${#L[@]}; i++ )); do RND=$RANDOM; let "RND %= $UP"; mv "${L[$i]}" "./$( printf "%05d\n" $RND)_$(basename -- "${L[$i]}")"; done; IFS=$SAVEIFSИспытываем:
Код: (bash) [Выделить]
user@mashine:~$ mkdir ~/Test
user@mashine:~$ for i in {0..9}; do touch ~/Test/file$i; done
user@mashine:~$ cd ~/Test  #ОБЯЗАТЕЛЬНО перейдите в целевой каталог ДО вызова скрипта. Иначе переименуете все, до чего скрипт сможет добраться, а не то, что хотели переименовать.
user@mashine:~/Test$ ls
#исходное состояние целевого каталога:
file0  file1  file2  file3  file4  file5  file6  file7  file8  file9
#выполняем наш однострочник:
user@mashine:~/Test$ SAVEIFS=$IFS; UP=10000; IFS=$'\n'; L=($( find ./ -type f )); for (( i=0; i<${#L[@]}; i++ )); do RND=$RANDOM; let "RND %= $UP"; mv "${L[$i]}" "./$( printf "%05d\n" $RND)_$(basename -- "${L[$i]}")"; done; IFS=$SAVEIFS
user@mashine:~/Test$ ls
#полученный результат:
00646_file6  04644_file2  05278_file7  06454_file8  07895_file0
02148_file4  05005_file5  05520_file9  07466_file3  08560_file1
Скрипт делает не совсем то, что Вам нужно. Предлагаю доработать под себя (разделитель вместо _ внедрить -, и число символов вместо 5, как у меня сделать 4 как у Вас).
« Последнее редактирование: 03 Июля 2020, 17:00:56 от zg_nico »
Thunderobot G150-D2: Intel SkyLake Core i7-6700HQ 2.60GHz, 8Gb DDR4 2133 MHz, Intel HD530, NVidia GeForce GTX 960M 2Gb.  Ubuntu 16.04 64x [Unity], KUbuntu 18.04 64x.

Оффлайн Magic Moment

  • Автор темы
  • Новичок
  • *
  • Сообщений: 4
    • Просмотр профиля
Странно. А оно-таки есть. Только надо случайное число добавить вместо счётчика, и будет ровно то, что Вам надо:
Ого, спасибо вам за такой ответ! Ту тему я видел, но GNU/Linux начал только изучать (курсы, нулевой уровень). Азы какие-то +- понимаю, но до скриптов еще не добрался. Потому правильно откорректировать код еще не могу. Вы мне получается даже каждую команду прописали для терминала? Очень вам за это благодарен! Сейчас буду пробовать и отпишусь.
(Нажмите, чтобы показать/скрыть)
Оверквотинг удален.
  --zg_nico
« Последнее редактирование: 03 Июля 2020, 17:58:10 от zg_nico »

Оффлайн ALiEN

  • Администратор
  • Старожил
  • *
  • Сообщений: 6849
  • Luck Tales
    • Просмотр профиля
Цитировать
Нужен bash-скрипт, который будет добавлять перед именем каждого файла в одной конкретной папке рандомную цифру от 1 до 10000.
Код: (bash) [Выделить]
find ./ -type f | while read F; do mv -v "$F" "${F%/*}/${RANDOM: -4}-${F##*/}" ; done
🖥 AsRock B550M Pro4 :: AMD Ryzen 5 3600 :: 16 GB DDR4 :: AMD Radeon RX 6600 :: XFCE
💻 ACER 5750G :: Intel Core i5-2450M :: 6 GB DDR3 :: GeForce GT 630M :: XFCE

Оффлайн zg_nico

  • Заслуженный пользователь
  • Почётный модератор
  • Старожил
  • *
  • Сообщений: 3513
  • Nil mortalibus arduum est
    • Просмотр профиля
ALiEN175, коротко и ясно :)
Thunderobot G150-D2: Intel SkyLake Core i7-6700HQ 2.60GHz, 8Gb DDR4 2133 MHz, Intel HD530, NVidia GeForce GTX 960M 2Gb.  Ubuntu 16.04 64x [Unity], KUbuntu 18.04 64x.

Оффлайн Magic Moment

  • Автор темы
  • Новичок
  • *
  • Сообщений: 4
    • Просмотр профиля
zg_nico, спасибо за помощь. Это то, что надо!
Немного подправилл, добавив L=($( find ./*.mp3 -type f )) чтобы скрипт не обрабатывал сам себя. (В папке лежит музыка)
ALiEN175, ваш вариант тоже работает, добавлю его в коллекцию)
Вот еще один вариант, который мне подсказали, может быть кому-то тоже пригодиться кто будет читать эту ветку:
ls | cat -n | while read n f; do mv "$f" "$(od -A n -N 2 -t u2 /dev/urandom)-track.mp3"; done

Оффлайн ALiEN

  • Администратор
  • Старожил
  • *
  • Сообщений: 6849
  • Luck Tales
    • Просмотр профиля
ls
Никогда не пытайтесь парсить вывод ls!
ТЫК ТЫК
« Последнее редактирование: 03 Июля 2020, 18:31:37 от ALiEN175 »
🖥 AsRock B550M Pro4 :: AMD Ryzen 5 3600 :: 16 GB DDR4 :: AMD Radeon RX 6600 :: XFCE
💻 ACER 5750G :: Intel Core i5-2450M :: 6 GB DDR3 :: GeForce GT 630M :: XFCE

Оффлайн Magic Moment

  • Автор темы
  • Новичок
  • *
  • Сообщений: 4
    • Просмотр профиля
ALiEN175, Ого, буду знать. А было казалось так удобно(

 

Страница сгенерирована за 0.031 секунд. Запросов: 25.