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

допустим у меня есть каталог полный .md файлы с разными именами. Допустим, я хотел бы добавить "текст" перед именем каждого файла. Так например: file a.md,b.md и c.md станет test - a.md,test - b.md и test - c.md.

как я могу сделать это через командную строку?

10
задан Jesse Atkinson
30.03.2023 10:31 Количество просмотров материала 2852
Распечатать страницу

7 ответов

ОДН-вкладыш который можно легко напечатать прямо от стержня:

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

или переписывается в отдельные строки с помощью точки с запятой:

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

экспозиция

синтаксис for (in sh):

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

здесь,NAME is 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
50
отвечен QuasarDonkey 2023-03-31 18:19

Если у вас prename...

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

использование обычных команд оболочки:

for file in *.md; do
    mv "$file" "test - $file"
done
11
отвечен grawity 2023-03-31 20:36

mmv1,2 также очень хороший инструмент для такой задачи, применительно к текущей работе, было бы

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

конечно, если вы хотите добавить только "test -" в a.md, b.md и c.md, но не a1.md, что-то вроде

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

было бы более уместно.

Я могу действительно предложить его, особенно если вы имеете много таких проблем.

Если вы дополнительно ищете графический интерфейс, попробуйте gprename.

5
отвечен Claudius 2023-03-31 22:53

вместо того, чтобы использовать цикл 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 напечатает только имя файла - без компонентов пути, которые сделают операцию переименования перерывом.

4
отвечен Fred Clausen 2023-04-01 01:10

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

autoload zmv
zmv -w '*' 'test - '

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

zmv -wn '*' 'test - '
  • -n означает сухой прогон, т. е. только показать, что произойдет.
  • -w неявно ставит скобки вокруг подстановочных знаков, делает backreferences работу.
0
отвечен Thor 2023-04-01 03:27

в bash, добавляя "Prepend text -" ко всем файлам в папке:

for i in *; do mv "$i" "$(echo $i | sed 's/^/Prepend\ text\ \-\ /')"; done;
0
отвечен Osiris 2023-04-01 05:44

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

rename '' 'name -' *.md
0
отвечен geekCoder 2023-04-01 08:01

Постоянная ссылка на данную страницу: [ Скопировать ссылку | Сгенерировать QR-код ]

Ваш ответ

Опубликуйте как Гость или авторизуйтесь

Имя
Вверх