Перейменування файлів у Linux з допомогою регулярного вираження


9

У мене була група файлів, які я хотів би послідовно перейменовувати, файли мають такі речі, як

"System-Log-01-01-2009-NODATA.txt"
"Something-Log-01-01-2009-NODATA.txt"

І я хотів, щоб вони були як малі, так і yyymmdd, .log розширення

"system.20090101.log"
"something.20090101.log"

Відповіді:


14

Для цього я писав сценарії perl, поки не виявив команду перейменування.

Він приймає регулярний вираз perl для перейменування:

для цього я просто набрав дві команди:

rename 's/(\w+)-(\w+)-(\d\d)-(\d{4})-NODATA.txt\$1.$4$3$2.log$//' *
rename 'y/A-Z/a-z/' *.log

Для деяких дистрибутивів renameця функція не має (див. Її підручну сторінку), і вам, можливо, доведеться встановити perl-renameабо prename.


дуже приємна відповідь
Judioo

8
Обережно, деякі дистрибутиви надсилають непотрібну команду перейменування. Перевірте, який у вашому дистрибутиві перший.
дероберт

Я знав, mmvале, врешті-решт, завдяки тому, що renameя можу використовувати силу регексу
Людовик Куті

5
У Arch Linux це perl-rename.
Олег Припін

6

Оскільки у мене немає команди перейменування, я покладаюся на це:

for myfile in /my/folder/*; do
    target=$(echo $myfile|sed -e 's/foo/bar/g')
    mv "$myfile" "$target"
done

5

mmv - це стандартна утиліта Linux для переміщення / перейменування декількох файлів. Він доступний з репостів для більшості дистрибутивів. Для прикладу, наведеного вище, ви можете зробити:

mmv *-Log-*-*-*-NODATA.txt #l1.#4#3#2.log

Для отримання додаткової інформації читайте цю статтю про дебют чи сторінку чоловіка .


5

renameutil не дуже "стандартний". Кожен дистрибутив постачається з різним renameінструментом. Наприклад, тут, на Gentoo, renameвід sys-apps/util-linuxпакета і не підтримує регулярний вираз.

Хаміш Даунер запропонував mmv, здається, корисним, спеціально для використання всередині сценаріїв.

З іншого боку, для загального випадку ви можете перейменувати утиліти . У ньому є qmvі qcpкоманди, які відкриють текстовий редактор на ваш вибір (моє уподобання: Vim) і дозволять вам редагувати там назви файлів призначення. Після збереження та закриття редактора, qmv/ qcpзробить усі перейменування.

І вони, mmvі qmvдосить розумні, щоб перейменувати файли у правильному порядку, а також виявити кругові перейменування, і автоматично створить тимчасовий файл, якщо потрібно.


На Gentoo ви також можете випустити sys-apps/renameпакет, який дає вам змогу renamexmперейменовувати регулярні виклики, а також масову верхню / нижню літери та інші приємні речі.
radicand

1

Справедливості:

rename 's/(\w+)-(\w+)-(\d\d)-(\d{4})-NODATA.txt\$1.$4$3$2.log$//' *.txt

дає такий вихід:

Use of uninitialized value $4 in regexp compilation at (eval 1) line 1.
Use of uninitialized value $3 in regexp compilation at (eval 1) line 1.
Use of uninitialized value $2 in regexp compilation at (eval 1) line 1.

Але:

rename -n 's/(\w+)-\w+-(\d{2})-(\d{2})-(\d{4})-NODATA\.txt$/$1.$4$3$2\.log/' *.txt && rename 'y/A-Z/a-z/' System.20090101.log

дає правильний вихід:

System-Log-01-01-2009-NODATA.txt renamed as System.20090101.log
System.20090101.log renamed as system.20090101.log

заміна перемикача {-n} на {-v}


1

Я створив невеликий сценарій bash для цього:

#!/bin/bash

for f in `ls /path/to/folder`; do
  # Create new filename from the old one
  # This example replaces A (upper case) with a (lower case)
  new_file=`echo "$new_file" | tr A a`

  # Rename the file
  mv "$f" "$new_file"
done

Загалом аналіз lsрезультатів не найкраща ідея. Випадковий пошук підтягнув цю довготривалу прочитану у Unix. SE для вашої розваги. | Крім того, ваша відповідь краще відповідатиме на запитанняtr '[:upper:]' '[:lower:]'
HBruijn
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.