Пакетне перейменування файлів у малі регістри


17

Чи є спосіб перейменувати всі файли в каталозі на малі | великі регістри?

Я шукаю команду oneliner .

Мені сподобалось TotalCommander's alt+f7, тепер мені потрібна ця функціональність в Терміналі

Відповіді:


20

a_fileПерейменуйте кожен файл у поточному каталозі a_fileна малі регістри.

for a_file in *;do mv -v "$a_file" `echo "$a_file" | tr [:upper:] [:lower:]` ;done;

У верхньому регістрі поверніть аргументи на [:lower:] [:upper:]

trКоманда посилання посилання

Оновлення

Для ще більшого контролю *можна замінити на ls.

Наприклад, у каталозі, що містить 1.txt, 2.txt, 3.txt, 1.jpg, 2.jpg та 3.jpg для фільтрації лише файлів * .jpg, lsможна використовувати:

for a_file in $(ls *.jpg);do mv -v $a_file `echo $a_file | tr [:upper:] [:lower:]` ;done;

Вищевказаний код призначить a_fileзмінним всі файли з розширенням .jpg.

Оновити додану -vопцію для mvкоманди відповідно до запропонованого sds .


4
ви можете передати "-v" mvтак, щоб побачити, що робиться; ви, можливо, не захочете пропустити "-f", оскільки це може прикути існуючі файли
sds

Це не працює для файлів з пробілами в їх імені.
Tianxiang Xiong

Ви можете використовувати лапки навколо імені файлу.
Стеф К

2
Вибачте, але частина про ls * jpg - це погана ідея. mywiki.wooledge.org/ParsingLs Цей самий результат можна досягти за допомогою * jpg в першу чергу там, де у вас був *.
Тінь

16

Є більш елегантна і загальна утиліта, яка називається prename .

Автор Ларрі Уолл, він постачається разом, perlтому він, швидше за все, вже доступний у вашій системі як /usr/bin/prename(якщо у вас є альтернативи налаштування, вони також можуть бути доступні як/usr/bin/rename посилання на / etc / alternative prename)

Використовуючи його, ви можете перейменовувати кілька файлів в одній команді, надаючи будь-який вираз perl (включаючи, але не обмежуючись ними, підстановку s/// або транслітерацією знаків tr///):

Приклади:

# Lowercase all *.JPG filenames:
prename tr/A-Z/a-z/ *.JPG

# Change any 'No' in a filename to a 'Yes':
prename s/No/Yes/g *No*

# increment first sequence of digits in a filename by 3:
prename 's/([0-9]+)/$1+3/e' *[0-9]*

# If a file contains 'aaa', append '.bak' to its name
prename 'if (/aaa/) {$_ .= ".bak"}'  *

І так далі.

Ще одна приємна річ щодо prename - це те, що воно захищає вас у випадку перейменування файлу на існуюче ім’я файлу.

man prename для отримання детальної інформації.


1

Використання find

find . -name * -type f -exec rename 'y/A-Z/a-z/' '{}' \;

Для find

  • Звичайно після того, як -nameнанесіть свій візерунок.
  • -maxdepth 0: Тільки поточний каталог.

Для rename

  • -n, -nono: Немає дій: друкуйте імена файлів, які слід перейменовувати, але не перейменуйте.
  • y/source/dest/: Транслітерація символів у просторі шаблонів, які з’являються у джерелі, до відповідного символу у dest.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.