Как массово добавить текст к именам файлов?

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
QuasarDonkey
источник
Это именно то, что мне нужно было увидеть. Благодарность!
Райан
11

Если у вас есть prename...

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

Используя обычные команды оболочки:

for file in *.md; do
    mv "$file" "test - $file"
done
grawity
источник
Как я могу получить prename?
Gaʀʀʏ
Кажется, для меня предустановлена ​​Ubuntu 16.04 LTS. Вы пробовали свой менеджер пакетов (т.е. sudo apt-get install)?
Orion751
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", так что find выведет только имя файла - без компонентов пути, которые могут привести к прерыванию операции переименования.

Фред Клаузен
источник
2

Я знаю, что уже поздно, но если кто-то ищет что-то подобное, у меня это сработало:

rename '' 'name -' *.md
nullptr
источник
1
просто и
понятно
0

Если у вас есть в zshналичии, вы можете использовать zmv:

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

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

zmv -wn '*' 'test - $1'
  • -n значит всухую, т.е. только покажи что будет.
  • -w неявно ставит круглые скобки вокруг подстановочных знаков, заставляет работать обратные ссылки.
Тор
источник
0

В bash добавление «Prepend text -» ко всем файлам в папке:

for i in *; do mv "$i" "$(echo $i | sed 's/^/Prepend\ text\ \-\ /')"; done;
Озирис
источник
Это очень длинный способ написанияfor i in *; do mv "$i$" "Prepend text - $i"; done
Дэвид Ричерби