LINUX.ORG.RU

Smart mv

 , ,


1

1

Привет! Наваял небольшую программу для собственных нужд, но вдруг и кому нибудь будет полезно, зацените!

В работе системного администратора часто бывают ситуации когда необходимо переименовать файл по его определенным критериям, например использовать часть его имени, дату изменения, хэш и т.п., для этих целей и создана эта программа. Принцип ее работы очень простой: имя файла передается хелперу (вспомогательной программе) которая в stdout пишет текст, затем smv разбивает его на слова которые используются в дальнейшем как символы подстановки в шаблоне имени результирующего файла.

Примеры :

Перемещение файла в каталог формата yyyy/mm/dd в зависимости от времени изменения файла:

smv -ph "stat -c %y" filename %1,1,4%/%1,6,2%/%1,9,2%/%0

переименовать все файлы с расширением .txt в md5 хэш:

smv -h md5sum "*.txt" %1%$

Скрипт перемещения *.txt файлов по каталогам год/месяц изменения файла:

#!/bin/sh

wd=/home/samba/all-msg/arc
/usr/local/bin/smv -ph 'stat -c %y' $wd/'*.txt' $wd/%1,1,4%/%1,6,2%/%0

Более полную информацию можно посмотреть на https://github.com/wellcomer/smv , там есть README, где всё более детально расписано, если будет интересно.

<дежурный комментарий про «ненужно» и про то, что есть перл>

anonymous ()
Ответ на: комментарий от anonymous

На перле/питоне/баше надоело такие скрипты писать и отлаживать.

wellcomer ()
Ответ на: комментарий от wellcomer

Разбираться в твоем коде сложнее, чем в привычном перле/питоне/баше

futurama ★★★★ ()

what had been seen cannot be unseen

  • >set(CMAKE_CXX_STANDARD 11)

    main.c

  • муть с лицензиями вместо diropen
  • копипаста со всего интернета для тривиальных вещей (кстати, ведь нельзя просто взять и скопипастить произвольный код из интернета в GPL-продукт, особенно в GPL3?)
  • не работает вне utf8-локали
  • КРИВОЙ shell escape
  • CMAKE_CXX_STANDARD 11 и при этом убогая возня с недостроками

Резюме: не пиши на C, тем более системных утилит.

kawaii_neko ★★★ ()

rename чем не угодил?

FIL ★★★★ ()

всё очень плохо

Deleted ()
Ответ на: комментарий от futurama

Попробовал переименовать файл 1.txt, вот что у меня получилось:

68b329da9893e34099c7d8ad5cb9c940 1.txt.txt

wellcomer ()
Ответ на: комментарий от wellcomer
prename -n 'my $x=`md5sum $_`; chomp $x; $x = (split /\W+/, $x)[0]; s/[^.]+/$x/' *.txt

не посмотрел что md5sum выдает два поля.

futurama ★★★★ ()
Ответ на: комментарий от futurama

И что это проще чем

smv -h md5sum "*.txt" %1%$ 

%1 - первое слово stdout md5sum
%$ - расширение файла
?

И никаких регулярок, а каково тем кто перл не знает?

wellcomer ()
Ответ на: комментарий от wellcomer

Х.з. как в rename но в баше просто:

for f in *.txt; do hash=`md5 -q $f`; mv $f $hash; done;

FIL ★★★★ ()
Ответ на: комментарий от wellcomer

тем что нужно учить новый (еще один) язык/формат

%1,1,4%/%1,6,2%/%1,9,2%/%0

futurama ★★★★ ()
Ответ на: комментарий от wellcomer

%$ - расширение файла

file.tar.gz

расширение файла это .gz или .tar.gz ???

futurama ★★★★ ()
Ответ на: комментарий от futurama

Выглядит страшновато, согласен, но если знать что stdout хелпера разбивается на слова, то %1, %2, %3, %4 это и есть номер слова, а после слова, после запятой всего лишь идет смещение внутри слова (опционально) то вот и весь формат.

wellcomer ()
Ответ на: комментарий от futurama

Всё что после последней точки (включая её), в данном случае .gz

wellcomer ()
Ответ на: комментарий от futurama

Но это не мешает сделать к примеру так:

smv -h md5sum "*.tar.gz" %1.tar.gz
wellcomer ()

Ждём ебилдов.

anonymous ()

%1,1,4%/%1,6,2%/%1,9,2%/%0

Не, спасибо, я лучше сразу perl выучу. Всяко полезнее будет.

anonymous ()

кроме mv есть еще (как минимум) cp и ln

anonymous ()
Ответ на: комментарий от wellcomer

а каково тем кто перл не знает?

Во-первых до уровня для такого задания перл осиливается за вечер.

Во-вторых покажи пример с расчетом sha256 например.

anonymous ()

как в связке find использовать?

anonymous ()
Ответ на: комментарий от anonymous

на перле еще дети твоего гробовщика писать будут.

anonymous ()
Ответ на: комментарий от anonymous

сильно сомневаюсь, из-за легаси разве что

anonymous ()

очередное доказательство мощи и лаконичности крестов: фунции utf8len, utf8index, дальше уже не читал. давайте, боги си, расскажите еще разок о своей эффективности, о ресурсах и байтах, обо всем вот этом в наших ненужно-пистонах и прочем, давайте же.

anonymous ()
Ответ на: комментарий от wellcomer

как рекурсивно переименовать все файлы с расширением .txt в md5 хэш?

anonymous ()

А как переименовать все *.txt во все *.dat? Вот виндовый move так умеет, вроде бы. Неужели нужно писать обрезатель на седе для такой типичной задачи?

vzzo ★★★ ()
Ответ на: комментарий от anonymous

Да, с рекурсией интересно, можно написать свой хелпер в пару строчек, который будет выводить путь к файлу и его md5 хэш, тогда это можно будет использовать в smv как %1/%2, но это не универсально. Я думаю добавить переменную «путь к файлу» для этих целей.

wellcomer ()

В таких случаях, вместо знания каких-то магических неясных последовательностей, я пишу Python-скрипт. Но в любом случае похвально, что они на тебя накинулись, будто ты в coreutils требуешь добавить свою полезняшку...

I-Love-Microsoft ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.