У меня есть несколько файлов:
10.3.100.179_01_20161018_230014_5335.jpg
10.3.100.179_01_20161018_231514_0814.jpg
10.3.100.179_01_20161018_233014_5706.jpg
10.3.100.179_01_20161018_234514_0896.jpg
10.3.100.179_01_20161018_230114_5395.jpg
10.3.100.179_01_20161018_231614_1145.jpg
10.3.100.179_01_20161018_233114_6047.jpg
10.3.100.179_01_20161018_234614_0547.jpg
10.3.100.179_01_20161018_230114_5492.jpg
10.3.100.179_01_20161018_231614_1264.jpg
10.3.100.179_01_20161018_233114_6146.jpg
10.3.100.179_01_20161018_234614_0658.jpg
10.3.100.179_01_20161018_230214_5630.jpg
10.3.100.179_01_20161018_231714_7135.jpg
Я хочу переименовать с этим форматом:
10.4.100.135_01_20161013131108389_TIMING.jpg
10.4.100.135_01_20161013131111390_TIMING.jpg
10.4.100.135_01_20161013131114401_TIMING.jpg
10.4.100.135_01_20161013131117431_TIMING.jpg
10.4.100.135_01_20161013131120418_TIMING.jpg
10.4.100.135_01_20161013131123461_TIMING.jpg
10.4.100.135_01_20161013131126511_TIMING.jpg
Необходимо удалить _
метку времени и добавить _TIMING
.
command-line
batch-rename
Jojo Mendoza
источник
источник
10.3.100.179
на10.4.100.135
. Это то, что вы хотите, или вы просто хотите убрать время_TIMING
и_
время?10.4.100.135_01_2016-10-13T13:11:08.389_TIMING.jpg
(и тогда «TIMING» можно было бы даже удалить, так как теперь он выглядит четко как дата и час (и миллисекунды), особенно когда стандарт становится более распространенным. T является частью стандарта, а я вырос, чтобы полюбить это (и выход из него нарушает стандарт ^^):
в имени файла. Я считаю, что Windows не поддерживает это.Ответы:
Установите
renameutils
и используйтеqmv
с вашим любимым текстовым редактором.qmv
загружает все имена в ваш редактор, а когда вы сохраняете и закрываете его, он применяет ваши изменения к реальным файлам. Если изменения противоречивы (например, два файла имеют одно и то же имя), они будут прерваны, ничего не трогая. Он также правильно обрабатывает циклические переименования.Я обычно делаю:
так что он показывает только один столбец имен (do: destination-only). Вот как это выглядит:
Если вы объедините его с несколькими курсорами SublimeText, Atom или Visual Studio Code, это станет очень хорошим и мощным инструментом для массового переименования. Например, для Atom, вы бы сделали
EDITOR="atom -w" qmv -f do
.источник
Используйте
rename
...При
-n
этом будет выводиться то, что он собирается делать без каких-либо изменений:Если это выглядит правильно, удалите
-n
Объясняя ...
s/something/something_else/
поиск и замена^
начало названия (якорь)[0-9]
любой номер+
один или несколько из предшествующего символа\.
литерал.
(без\
этого соответствует любому символу)()
чтобы сохранить эту часть$1$2$3$3
обратные ссылки на вещи, сопоставленные ранее и сохраненные с()
Примечание:
*
в конце команды отображаются все видимые файлы в текущем каталоге. При необходимости используйте более подходящий шарик.источник
prename
(p для perl, потому что первый аргумент является выражением perl)mmv
можно сделать как в следующем:# 1, # 2, # 3, ... ссылаются здесь на соответствующие '*' здесь.
Это еще короче с:
источник
Другой
rename
подход:Если это работает так, как вы хотите, удалите
-n
.источник
Вы также можете использовать следующее. Сначала сделайте резервную копию ваших файлов и попробуйте это:
sed 's/\(.*\)_\(.*\)_/\1\2/')
удаляет_
символы в метке времени.Например:
источник
find -maxdepth 1 -exec rename ... {} +
пакетную распечатку текущего каталога в командной строке переименования. (добавить-name *.jpg
или все, что вы хотите). Это будет выполняться намного быстрее, чем цикл оболочки, который разветвляется + execssed
иmv
для каждого имени файла, вместо просто системного вызова переименования. (Вы можете избавиться отsed
использования встроенных в bash регулярных выражений, но разветвлениеmv
все еще медленное.)Вы, вероятно, закончили, но вот (простое)
bash
решение для всех :"Простое ... решение для bash" - оксюморон?
PS: логика в цикле была проверена с одним из ваших примеров имен файлов. Это прошло.
источник
[[ $f ~= (.*)_(.*)_(.*)_(.*)\.jpg ]];
newname=${BASH_REMATCH[1]${BASH_REMATCH:2:4}TIMING.jpg
или что-то. (полностью непроверено и, вероятно, неправильно, но общая идея состоит в том, что группы захвата входят в массив BASH_REMATCH.)bash
) захват групп, и, если честно, bash - не первый язык, на котором я их пробую. (Я думаю, чтоbash
это некрасивый язык.) Тем не менее, это хорошее решение, и оно научило меня чему-то так.printf -v "$3" ...
для установки переменной, в которой находится имя$3
.) Разобрать всю командную строку и вернуть ее обратно вместе довольно сложно следить / отлаживать, по крайней мере, я нашел это таким образом, пытаясь очистить / исправить ошибки. Смотрите код на githubЕсли бы вы могли использовать графический интерфейс, я бы порекомендовал pyRenamer .
Он присутствует в большинстве дистрибутивов, например, в Ubuntu:
Он может делать все, что вы хотите и даже больше.
источник
Вот ваш сырой встроенный
find
+xargs
+sed
+mv
Oneliner (любовь oneliners):Объяснение:
find . -name "*.jpg" | sort | xargs sh -c <command> sh
: вывести список всех JPEG-файлов в текущем каталоге, а затем выполнить команду оболочки для каждого из них (сортировка, конечно, не обязательна, но если вы куда-то входите, то немного чище)-print0
,-z
,-0
: Это хорошая привычка к отдельным пунктам с двоичным0
когда tokenizing имен файлов , чтобы избежать проблем с в-середины белого-пространство (не ваш случай , хотя)mv "$filename" $(echo "${filename}" | sed "s/\([0-9]\{8\}\)_\([0-9]\{6\}\)_\([0-9]\{4\}\)/\1\2\3_TIMING/g");
: (Слешsed
«s регулярного выражение не поможет читаемости, но это просто) переименовать каждый файл, заменив подчеркивание-separeted последовательности 8 + 6 + 4 цифр с их непрерывной конкатенацией плюс этой_TIMING
вещью (\i
в обратную ссылки наi
- группа регулярных выражений).Refs: Xargs - человек сед
источник