Як масово додавати текст до імен файлів?


44

Скажімо, у мене є каталог, наповнений .mdфайлами, які називають різні речі. Скажімо, я хотів додати "текст" до передньої частини кожного імені файлу. Так, наприклад: файл a.md, b.mdі c.mdстав би test - a.md, test - b.mdі test - c.md.

Як я можу це досягти за допомогою командного рядка?

Відповіді:


60

Один вкладиш, який можна легко набрати прямо з терміналу:

for f in *.md; do mv "$f" "test - $f"; done

Або переписати окремими рядками замість крапки з комою:

for f in *.md
do
    mv "$f" "test - $f"
done

Експозиція

Синтаксис forsh):

for NAME [in WORDS ... ] ; do COMMANDS; done

Тут наш NAMEє fі наші WORDSвсі файли в поточному каталозі відповідно *.md. Таким чином, змінна $fбуде замінена кожним відповідним файлом *.md.

Отже для a.md:

mv "$f" "test - $f"

стає

mv "a.md" "test - a.md"

Лапки важливі, оскільки кожне ім'я файлу $fможе містити пробіли. Інакше можна mvбуло б подумати, що кожне слово є окремим файлом. Наприклад, якщо не було лапок, а є файл, який називається Foo Bar.md, це перекладається як:

mv Foo Bar.md test - Foo Bar.md

який би не працював так, як задумано. Але, загортаючи $fцитати, має сенс:

mv "Foo Bar.md" "test - Foo Bar.md"

Відзначаючи синтаксис for, ви також можете перейменувати підмножину всіх *.mdфайлів, називаючи кожен чітко:

for f in a.md b.md d.md; do mv "$f" "Test - $f"; done

Або за допомогою розширення оболонки:

for f in {a,b,d}.md; do mv "$f" "Test - $f"; done

Це саме те, що мені потрібно було бачити. Дякую!
Райан

11

Якщо у вас є prename...

prename 's/^/test - /' *.md

Використання звичайних команд оболонки:

for file in *.md; do
    mv "$file" "test - $file"
done

Як мені дістатись prename?
Gaʀʀʏ

Здається, що для мене встановлено на Ubuntu 16.04 LTS. Ви спробували менеджера пакунків (тобто. sudo apt-get install)?
Оріон751

5

mmv1 , 2 - це також дуже приємний інструмент для такого завдання, застосований до поточної роботи

mmv '*.md' 'test - #1.md'

Звичайно, якщо ви хочете лише додати "test -" до a.md, b.md та c.md, але не a1.md, щось подібне

mmv '?.md' 'test - #1.md'

було б більш доречним.

Я справді можу запропонувати це, особливо якщо у вас багато таких проблем.

Якщо ви додатково шукаєте графічний інтерфейс, спробуйте gprename .


5

Замість того, щоб використовувати цикл for, який вийде з ладу на пробілах, якщо ви не визначите змінну IFS, я б рекомендував використовувати цикл while у поєднанні з find. Наступне буде працювати при запуску з того самого каталогу, що і файли

find . -maxdepth 1 -type f -name '*.md' | while read -r file; do
    file=$(basename $file)
    mv "$file" "test - $file"
done

рядок "basename" знаходиться там, щоб знахідка друкувала лише ім'я файлу - без компонентів шляху, які б перервали операцію перейменування.


2

Я знаю, що насправді пізно, але якщо хтось інший шукає щось подібне, то це працювало для мене:

rename '' 'name -' *.md

1
простий та прямий
користувач13743

0

Якщо у вас є zshдоступ, ви можете використовувати zmv:

autoload zmv
zmv -w '*' 'test - $1'

Ви можете протестувати команду за допомогою:

zmv -wn '*' 'test - $1'
  • -n означає сухий пробіг, тобто лише показуйте, що буде.
  • -w неявно ставить круглі дужки навколо макіяжних символів, змушує референції працювати.

0

У bash, додавши "Попередній текст -" до всіх файлів у папці:

for i in *; do mv "$i" "$(echo $i | sed 's/^/Prepend\ text\ \-\ /')"; done;

Це дуже довгий спосіб написанняfor i in *; do mv "$i$" "Prepend text - $i"; done
Девід Річербі
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.