связка find xargs mv (переименование файлов.)

На самом деле это единственный раздел про unix на этом форуме

Модератор: /dev/random

Аватара пользователя
hikkispb
Сообщения: 31
ОС: Ubuntu 14.04lts

связка find xargs mv

Сообщение hikkispb » 21.06.2016 17:05

Подскажите пожалуйста.

Цель: переименовать кучу картинок нерекурсивно ТОЛЬКО в текущей папке, создавая их имена согласно времени файлов.

Так не получается:

find . *.jpg -maxdepth 0 | xargs mv news-$(date +%Y%m%d-%b).jpg
Начинающий пингвин. Изображение
Спасибо сказали:

BigBrother
Сообщения: 436
Статус: ¯\_(ツ)_/¯
ОС: linux based

Re: связка find xargs mv

Сообщение BigBrother » 21.06.2016 17:18

hikkispb писал(а):
21.06.2016 17:05
find . *.jpg -maxdepth 0 | xargs mv news-$(date +%Y%m%d-%b).jpg

такой способ приведет к созданию одного файла.

делай так

Код: Выделить всё

find . *.jpg -maxdepth 0 -exec mv {} news-$(date +%Y%m%d-%b)_{} \;
Спасибо сказали:

Аватара пользователя
nerve
Сообщения: 270
ОС: OpenBSD

Re: связка find xargs mv

Сообщение nerve » 21.06.2016 17:18

то есть на выходе получится один файл??
Спасибо сказали:

Аватара пользователя
Bizdelnick
Модератор
Сообщения: 15912
Статус: grammatikführer
ОС: Debian GNU/Linux

Re: связка find xargs mv

Сообщение Bizdelnick » 21.06.2016 17:22

Или find . -maxdepth 1 -name '*.jpg', или (что на мой взгляд проще) for file in *.jpg; do <what you want>; done
При этом:
  • Шаблоны для find, содержащие *, надо брать в кавычки, чтобы они не раскрывались шеллом.
  • С find лучше использовать опцию -exec <...> или find <...> -print0 | xargs -0 <...>.
  • xargs добавляет аргумент в конец командной строки, а не в начало.
  • Для date у Вас не хватает опции -r. Без неё, как отметили выше, имя целевого файла всегда будут одно и то же, и Вы в итоге затрёте все файлы кроме одного.
Пишите правильно:
в консоли
вкупе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:

Аватара пользователя
hikkispb
Сообщения: 31
ОС: Ubuntu 14.04lts

Re: связка find xargs mv

Сообщение hikkispb » 21.06.2016 17:26

(BigBrother) писал(а):делай так

Код: Выделить всё

find . *.jpg -maxdepth 0 -exec mv {} news-$(date +%Y%m%d-%b)_{} \;


Что-то пошло не так:

Код: Выделить всё

mv: невозможно переместить «.» в «news-20160621-июня_.»: Устройство или ресурс занято


А в папке файлы такого вида:
news-20160621-июня_dscn3077.jpg

Он кажется не заменил, а добавил к имени.
И в имени нужно не "июня...",а время в формате 24 с ведущим нулём.
Начинающий пингвин. Изображение
Спасибо сказали:

Аватара пользователя
Bizdelnick
Модератор
Сообщения: 15912
Статус: grammatikführer
ОС: Debian GNU/Linux

Re: связка find xargs mv

Сообщение Bizdelnick » 21.06.2016 17:29

hikkispb писал(а):
21.06.2016 17:26
в имени нужно не "июня...",а время в формате 24 с ведущим нулём.

Таки прочитайте man date и напишите правильный шаблон.
Пишите правильно:
в консоли
вкупе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:

Аватара пользователя
SLEDopit
Модератор
Сообщения: 4667
Статус: фанат консоли (=
ОС: GNU/Debian, RHEL

Re: связка find xargs mv

Сообщение SLEDopit » 21.06.2016 17:34

hikkispb писал(а):
21.06.2016 17:26
Что-то пошло не так:
Так ограничьте find, чтобы он только файлы искал, а директории пропускал. -type f .
В идеале ещё проверку нужно запилить, чтобы всё файлы в один не записать. Ну или хотя бы -i к mv добавить.
UNIX is basically a simple operating system, but you have to be a genius to understand the simplicity. © Dennis Ritchie
The more you believe you don't do mistakes, the more bugs are in your code.
Спасибо сказали:

Аватара пользователя
hikkispb
Сообщения: 31
ОС: Ubuntu 14.04lts

Re: связка find xargs mv

Сообщение hikkispb » 21.06.2016 17:38

Bizdelnick, если бы всё было так просто, я не писал бы на форумах.
Не знал какой ман глядеть вообще. Изначально нагуглил тут, думал совместимо...

Насчёт читать маны, процитирую золотые слова, полностью отражающие и моё мнение:

По непонятным причинам, маны пишутся так, что понять их можно только зная, что из себе представляет программа и как ей пользоваться. 90% манов всего лишь предостовляют инфу по синтаксису и ключам. Мазохисты может быть и станут разбираться с прогой по манам, но я уже прошел этот этап, и знаю, что это практически бесполезно.

http://www.linux.org.ru/forum/development/...comment-4013871


Начинающий пингвин. Изображение
Спасибо сказали:

Аватара пользователя
hikkispb
Сообщения: 31
ОС: Ubuntu 14.04lts

Re: связка find xargs mv

Сообщение hikkispb » 21.06.2016 17:50

SLEDopit писал(а):
21.06.2016 17:34
...В идеале ещё проверку нужно запилить, чтобы всё файлы в один не записать. Ну или хотя бы -i к mv добавить.


Благодарю. Но такая вот конструкция всё равно только добавляет к имеющемуся имени новое.

find . *.jpg -maxdepth 0 -type f -exec mv -i {} news-$(date +%Y%m%d-%H%M%S)_{} \;

На выходе:

news-20160621-174649_СТАРОЕ ИМЯ.jpg

Откуда взялось "_СТАРОЕ ИМЯ" и как его избежать, скажите пожалуйста.
Начинающий пингвин. Изображение
Спасибо сказали:

Аватара пользователя
Bizdelnick
Модератор
Сообщения: 15912
Статус: grammatikführer
ОС: Debian GNU/Linux

Re: связка find xargs mv

Сообщение Bizdelnick » 21.06.2016 17:52

hikkispb писал(а):
21.06.2016 17:38
Не знал какой ман глядеть вообще.

Как обычно — тот, который установлен в Вашей системе.

hikkispb писал(а):
21.06.2016 17:38
маны пишутся так, что понять их можно только зная, что из себе представляет программа и как ей пользоваться

Правильно, для других случаев есть более полная документация. См. в частности info coreutils (онлайн-версия) или какую-нибудь хорошую книжку, которых есть в количестве. А вот что забыли написать на ЛОРе, так это самое главное: не зная, что из себя представляет программа и как ей пользоваться, пытаться её использовать категорически противопоказано. Вы вот чуть было не потёрли все свои картинки.
Пишите правильно:
в консоли
вкупе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:

Аватара пользователя
Bizdelnick
Модератор
Сообщения: 15912
Статус: grammatikführer
ОС: Debian GNU/Linux

Re: связка find xargs mv

Сообщение Bizdelnick » 21.06.2016 17:58

hikkispb писал(а):
21.06.2016 17:50
find . *.jpg -maxdepth 0 -type f -exec mv -i {} news-$(date +%Y%m%d-%H%M%S)_{} \;

Что Вы делаете, можете объяснить? Это бессмыслица — передавать find каталог (.), ограничивать глубину вложенности 0 (-maxdepth 0) и заставлять его искать только файлы (-type f).

hikkispb писал(а):
21.06.2016 17:50
Откуда взялось "_СТАРОЕ ИМЯ" и как его избежать, скажите пожалуйста.

Оно взялось из {}. Если Вы его уберёте, повторю в который уже раз, имя целевого файла всегда будет всегда одно и то же, и Вы в итоге затрёте все файлы кроме одного (если файлов много или они большие, так что процесс займёт больше секунды, то нескольких).
Пишите правильно:
в консоли
вкупе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:

Аватара пользователя
hikkispb
Сообщения: 31
ОС: Ubuntu 14.04lts

Re: связка find xargs mv

Сообщение hikkispb » 21.06.2016 17:59

Bizdelnick, ну я не полный дебил, я их предварительно забэкапил уровнем выше, да и экспериментирую на отдельном десятке файлов в другой подпапке)

А зная, что из себя представляет программа и как ей пользоваться, ман нужен только как справочник. Поэтому не понимаю, зачем вместо описания работы с командой посылают читать справочник.Это как вместо автошколы посылать читать инструкцию по эксплуатации автомобилем.
Начинающий пингвин. Изображение
Спасибо сказали:

Аватара пользователя
Bizdelnick
Модератор
Сообщения: 15912
Статус: grammatikführer
ОС: Debian GNU/Linux

Re: связка find xargs mv

Сообщение Bizdelnick » 21.06.2016 18:06

Вот Вам готовое решение, я сегодня добрый, а картинки, право же, ни в чём не виноваты: for file in *.jpg; do mv -bv "$file" "news-$(date -r "$file" +%Y%m%d-%H%M%S).jpg" ; done
Но послушайте совета: не вбивайте в консоль какие бы то ни было команды, если не понимаете, что они делают.

hikkispb писал(а):
21.06.2016 17:59
не понимаю, зачем вместо описания работы с командой посылают читать справочник.Это как вместо автошколы посылать читать инструкцию по эксплуатации автомобилем.

Кто ж знал, что Вы без прав за руль сели...
Пишите правильно:
в консоли
вкупе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:

Аватара пользователя
hikkispb
Сообщения: 31
ОС: Ubuntu 14.04lts

Re: связка find xargs mv

Сообщение hikkispb » 21.06.2016 18:15

Извините, не знал,что за линуксы нынче без сертификата садиться нельзя...

Не сработало к сожалению:

Spoiler

$ for file in *.jpg; do mv -bv "$file" "news-$(date -r "$file"+%Y%m%d-%H%M%S).jpg" ; done
date: news-20160621-180617_11388483.jpg+%Y%m%d-%H%M%S: Нет такого файла или каталога
«news-20160621-180617_11388483.jpg» -> «news-.jpg»
date: news-20160621-180617_11388487.jpg+%Y%m%d-%H%M%S: Нет такого файла или каталога
«news-20160621-180617_11388487.jpg» -> «news-.jpg» (резервная копия: «news-.jpg~»)
date: news-20160621-180617_11388488.jpg+%Y%m%d-%H%M%S: Нет такого файла или каталога
«news-20160621-180617_11388488.jpg» -> «news-.jpg» (резервная копия: «news-.jpg~»)
date: news-20160621-180617_11388489.jpg+%Y%m%d-%H%M%S: Нет такого файла или каталога
«news-20160621-180617_11388489.jpg» -> «news-.jpg» (резервная копия: «news-.jpg~»)

$ ls
news_files news-.jpg news-.jpg~ testwork.sh testwork.sh~


Начинающий пингвин. Изображение
Спасибо сказали:

Аватара пользователя
Bizdelnick
Модератор
Сообщения: 15912
Статус: grammatikführer
ОС: Debian GNU/Linux

Re: связка find xargs mv

Сообщение Bizdelnick » 21.06.2016 18:21

Прошу прощения, опечатался — пробел пропустил. Исправил в предыдущем сообщении.
Пишите правильно:
в консоли
вкупе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:

Аватара пользователя
hikkispb
Сообщения: 31
ОС: Ubuntu 14.04lts

Re: связка find xargs mv

Сообщение hikkispb » 21.06.2016 18:40

Опять что-то не так.

На выходе некоторые файлы получаются с тильдой в расширении (news-20160620-223935.jpg~) : вероятно одинаковая дата вплоть до секунды.


Как бы добавлять в случае одинаковой даты 1,2,3,.. в имя, а не "~" в расширение?
Начинающий пингвин. Изображение
Спасибо сказали:

Аватара пользователя
Bizdelnick
Модератор
Сообщения: 15912
Статус: grammatikführer
ОС: Debian GNU/Linux

Re: связка find xargs mv

Сообщение Bizdelnick » 21.06.2016 18:49

hikkispb писал(а):
21.06.2016 18:40
На выходе некоторые файлы получаются с тильдой в расширении (news-20160620-223935.jpg~) : вероятно одинаковая дата вплоть до секунды.

Да, именно на этот случай я и добавил опцию -b для mv.

hikkispb писал(а):
21.06.2016 18:40
Как бы добавлять в случае одинаковой даты 1,2,3,.. в имя, а не "~" в расширение?

mv умеет добавлять только суффикс, в середину имени он ничего вставить не может. Тут надо писать более хитрый скрипт.
Пишите правильно:
в консоли
вкупе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:

Аватара пользователя
hikkispb
Сообщения: 31
ОС: Ubuntu 14.04lts

Re: связка find xargs mv

Сообщение hikkispb » 21.06.2016 21:30

Может тогда использовать не mv? Посоветуйте пожалуйста. Хотелось бы изящное решение, чтобы в копилку пошло, не хочу костыли придумывать.
Начинающий пингвин. Изображение
Спасибо сказали:

Аватара пользователя
Bizdelnick
Модератор
Сообщения: 15912
Статус: grammatikführer
ОС: Debian GNU/Linux

Re: связка find xargs mv

Сообщение Bizdelnick » 21.06.2016 22:01

А я разве предлагал костыли?
Так или иначе, сначала определитесь, во что Вы хотите переименовывать файлы.
Пишите правильно:
в консоли
вкупе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:

Аватара пользователя
hikkispb
Сообщения: 31
ОС: Ubuntu 14.04lts

Re: связка find xargs mv

Сообщение hikkispb » 21.06.2016 22:52

Поскольку выяснилось, что дата-время у половины из них не уникальны, то я уже и не знаю =( Просто порядково пронумеровать не хотелось бы.Можно ли пронумеровать ТОЛЬКО совпадающие?
Начинающий пингвин. Изображение
Спасибо сказали:

Аватара пользователя
Bizdelnick
Модератор
Сообщения: 15912
Статус: grammatikführer
ОС: Debian GNU/Linux

Re: связка find xargs mv

Сообщение Bizdelnick » 22.06.2016 09:25

Можно всё что угодно. Но это уже будет заметно сложнее.
Пишите правильно:
в консоли
вкупе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:

NickLion
Сообщения: 3408
Статус: аватар-невидимка
ОС: openSUSE Tumbleweed x86_64

Re: связка find xargs mv

Сообщение NickLion » 22.06.2016 13:13

Работать будет только в bash (версии 4):
declare -A tmu=(); for file in *.jpg; do ((tmu[$(date -r "$file" +%Y%m%d-%H%M%S)]++)); done; declare -A idx=(); for file in *.jpg; do name=$(date -r "$file" +%Y%m%d-%H%M%S); if ((tmu[$name]!=1)); then ((idx[$name]++)); name=$(printf %s-%03d $name ${idx[$name]}); fi; mv "$file" "news-$name.jpg"; done

UPD По сути — это решение Bizdelnik'а связка find xargs mv , дополненное хешем для проверки совпадений до переименования.
Спасибо сказали:

Аватара пользователя
hikkispb
Сообщения: 31
ОС: Ubuntu 14.04lts

Re: связка find xargs mv

Сообщение hikkispb » 22.06.2016 19:07

Спасибо большое. Хороший пример для изучения.

Такие были ошибки:
Spoiler

mv: неверный ключ — «5»
По команде «mv --help» можно получить дополнительную информацию.
mv: неверный ключ — «m»
По команде «mv --help» можно получить дополнительную информацию.
mv: неверный ключ — «d»
По команде «mv --help» можно получить дополнительную информацию.


Эти файлы остались без переименования:
Spoiler

-nnd73fkh3q.jpg
-fmphxq8y5g.jpg
deni_zahitnika_otechestva.png
a_002.JPG a.JPG
-5lpqfiqifm.jpg
310.JPG


Остальное ок.
Начинающий пингвин. Изображение
Спасибо сказали:

Аватара пользователя
Bizdelnick
Модератор
Сообщения: 15912
Статус: grammatikführer
ОС: Debian GNU/Linux

Re: связка find xargs mv

Сообщение Bizdelnick » 22.06.2016 19:12

Чтобы имена файлов, начинающиеся с дефиса, не воспринимались mv как опции, надо заменить mv "$file" "news-$name.jpg" на mv -- "$file" "news-$name.jpg". Остальные файлы просто не соответствуют маске *.jpg, потому и не переименовались.
Пишите правильно:
в консоли
вкупе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:

Аватара пользователя
hikkispb
Сообщения: 31
ОС: Ubuntu 14.04lts

Re: связка find xargs mv

Сообщение hikkispb » 22.06.2016 21:03

Большое спасибо, так работает. Ведь никогда не знаешь, как там клиенту на душу положило файлы обозвать)

А как избежать ошибки:

mv: «nws-234413-001.jpg» и «nws-234413-001.jpg» - один и тот же файл

Чтобы если есть -001 начинал с -002, либо с -003, если -002 занят?

Начинающий пингвин. Изображение
Спасибо сказали:

Аватара пользователя
hikkispb
Сообщения: 31
ОС: Ubuntu 14.04lts

Re: связка find xargs mv

Сообщение hikkispb » 22.06.2016 21:23

А ещё не удаётся пакетно переименовать файлы в верхнем регисте. Не срабатывает:

rename 'y/A-Z/a-z/' *
rename 'y/A-Z/a-z/' *.JPG
rename 's/\.JPG$/\.jpg/' *.JPG

UPD.: Кажется я догадываюсь, в чём дело. у меня есть файлы с одинаковыми именами с разницей лишь в регистре расширения. Переименовал вручную. Но как быть, если их много?
Начинающий пингвин. Изображение
Спасибо сказали:

Аватара пользователя
Bizdelnick
Модератор
Сообщения: 15912
Статус: grammatikführer
ОС: Debian GNU/Linux

Re: связка find xargs mv

Сообщение Bizdelnick » 22.06.2016 22:27

hikkispb писал(а):
22.06.2016 21:23
Не срабатывает:

rename 'y/A-Z/a-z/' *
rename 'y/A-Z/a-z/' *.JPG
rename 's/\.JPG$/\.jpg/' *.JPG

Вот тут вопрос в том, что у Вас скрывается под именем rename, потому что есть две утилиты с таким названием. Попробуйте так: prename 'y/A-Z/a-z/' *
Пишите правильно:
в консоли
вкупе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:

Аватара пользователя
hikkispb
Сообщения: 31
ОС: Ubuntu 14.04lts

Re: связка find xargs mv

Сообщение hikkispb » 22.06.2016 22:39

Не знаю, что у меня скрывается, ведь /? ему не скажешь, в теле есть слова: "util-linux 2.20.1"
$ ls -all /usr/bin/rename
lrwxrwxrwx 1 root root 24 янв. 13 04:06 /usr/bin/rename -> /etc/alternatives/rename

Ваш вариант с "К" помог, большое спасибо!

Меня ещё беспокоит ответ на сообщение #25.
Если не сильно обеспокоит...
Начинающий пингвин. Изображение
Спасибо сказали:

NickLion
Сообщения: 3408
Статус: аватар-невидимка
ОС: openSUSE Tumbleweed x86_64

Re: связка find xargs mv

Сообщение NickLion » 23.06.2016 09:27

hikkispb писал(а):
22.06.2016 21:03
А как избежать ошибки:

mv: «nws-234413-001.jpg» и «nws-234413-001.jpg» - один и тот же файл

Чтобы если есть -001 начинал с -002, либо с -003, если -002 занят?

Проще всего сначала все файлы переименовать в нейтральные имена, вроде 1.jpg ... n.jpg (или "хеш файла".jpg), а потом уже переименовывать по дате/времени. Можно, конечно, и скрипт этим озаботить, но что если файл имеет имя nws-234413-001.jpg, а по времени в дальнейшем будет переименован в nws-234545.jpg ?
Спасибо сказали:

Аватара пользователя
Bizdelnick
Модератор
Сообщения: 15912
Статус: grammatikführer
ОС: Debian GNU/Linux

Re: связка find xargs mv

Сообщение Bizdelnick » 23.06.2016 10:35

hikkispb писал(а):
22.06.2016 22:39
Не знаю, что у меня скрывается, ведь /? ему не скажешь, в теле есть слова: "util-linux 2.20.1"

Вы не поверите, но в man rename всё написано.
Пишите правильно:
в консоли
вкупе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали: