Быстрое переименование большого количества файлов

()

Допустим у вас есть большое количество файлов с неправильными названиями, и вы хотите это исправить. Для этого можно воспользоваться командой for, которая помогает организовать цикл для обработки каких-либо данных.

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

for var in <files>; do <command> $var;done

Вы можете заменить <files> на любую маску файлов, например * или *.txt, а так же заменить <command> на любую команду Linux.

Ещё одна интересная вещь вы можете изменять имя файла для "mv $var" следующим образом:

${var/originaltext/replacetext}

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

for f in *;do mv $f ${f/test/prod};done

Тогда для каждого файла, попадающего под маску * (т.е. в данном случае для любого:)) будет выполнена примерно вот такая команда:

mv test.config prod.config

Конечно есть множество более удобных инструментов, однако умение делать такие вещи в командной строке несомненно будет полезным.

Источник

Комментарии:

Killy 2007-07-18 18:08:52 (#)

Седует помнить, что операция вида ${var/originaltext/replacetext} доступна только в bash, но никак не в POSIX sh.

MooSE 2007-07-19 11:49:37 (#)

Killy, ты конечно прав. Я действительно забыл об этом упомянуть, хотя в оригинальной статье это было. Но если говорить о Linux - то почти везде используется bash.:)

Killy 2007-07-20 15:13:27 (#)

MooSE, ну ведь это не очевидно. =) Причем некоторым нравится zsh.

Как текст у тебя тут жирным делать, а?

MooSE 2007-07-21 11:17:35 (#)

Никак:) Оно только твой ник жирным подсвечивает:) Т.е. ник того, кто читает. Это фишка такая:)

Вот когда я к тебе, Killy, обращаюсь, а ты читаешь - ты свой ник жирным видишь:)

just free man 2007-07-24 18:05:59 (#)

for f in *; do mv $f $(echo $i | sed 's/test/prod/g'); done

так, вроде, должно работать в POSIX-совместимом shell при наличии sed (по крайней мере, конструкция $(command) есть в примере в мануале по POSIX sh).

MooSE 2007-07-24 19:45:27 (#)

Не совсем так. В POSIX-совместимой оболочке правильнее всё-таки будет:

for f in *; do mv $f `echo $f|sed "s/test/prod/"`; done

Хотя я конечно могу и ошибаться...

just free man 2007-07-25 12:14:41 (#)

и так и там можно :)
http://www.opengroup.org/onlinepubs/000095399/utilities/xcu_chap02.html#tag_02_06_03

MooSE 2007-07-25 20:27:15 (#)

Хм... Буду знать:)
Новый комментарий



© 2006-2016 Вадим Калинников aka MooSE