связка find xargs mv (переименование файлов.)
Модераторы: /dev/random, Модераторы разделов
-
- Сообщения: 34
- ОС: Ubuntu 14.04lts
связка find xargs mv
Подскажите пожалуйста.
Цель: переименовать кучу картинок нерекурсивно ТОЛЬКО в текущей папке, создавая их имена согласно времени файлов.
Так не получается:
find . *.jpg -maxdepth 0 | xargs mv news-$(date +%Y%m%d-%b).jpg
Цель: переименовать кучу картинок нерекурсивно ТОЛЬКО в текущей папке, создавая их имена согласно времени файлов.
Так не получается:
find . *.jpg -maxdepth 0 | xargs mv news-$(date +%Y%m%d-%b).jpg
Начинающий пингвин.
-
- Сообщения: 436
- Статус: ¯\_(ツ)_/¯
- ОС: linux based
Re: связка find xargs mv
такой способ приведет к созданию одного файла.
делай так
Код: Выделить всё
find . *.jpg -maxdepth 0 -exec mv {} news-$(date +%Y%m%d-%b)_{} \;
-
- Сообщения: 280
- ОС: OpenBSD
Re: связка find xargs mv
то есть на выходе получится один файл??
-
- Модератор
- Сообщения: 21033
- Статус: nulla salus bello
- ОС: Debian GNU/Linux
Re: связка find xargs mv
Или find . -maxdepth 1 -name '*.jpg', или (что на мой взгляд проще) for file in *.jpg; do <what you want>; done
При этом:
При этом:
- Шаблоны для find, содержащие *, надо брать в кавычки, чтобы они не раскрывались шеллом.
- С find лучше использовать опцию -exec <...> или find <...> -print0 | xargs -0 <...>.
- xargs добавляет аргумент в конец командной строки, а не в начало.
- Для date у Вас не хватает опции -r. Без неё, как отметили выше, имя целевого файла всегда будут одно и то же, и Вы в итоге затрёте все файлы кроме одного.
Пишите правильно:
в консоли вку́пе (с чем-либо) в общем вообще | в течение (часа) новичок нюанс по умолчанию | приемлемо проблема пробовать трафик |
-
- Сообщения: 34
- ОС: Ubuntu 14.04lts
Re: связка find xargs mv
(BigBrother) писал(а):делай так
Код: Выделить всё
find . *.jpg -maxdepth 0 -exec mv {} news-$(date +%Y%m%d-%b)_{} \;
Что-то пошло не так:
Код: Выделить всё
mv: невозможно переместить «.» в «news-20160621-июня_.»: Устройство или ресурс занято
А в папке файлы такого вида:
news-20160621-июня_dscn3077.jpg
Он кажется не заменил, а добавил к имени.
И в имени нужно не "июня...",а время в формате 24 с ведущим нулём.
Начинающий пингвин.
-
- Модератор
- Сообщения: 21033
- Статус: nulla salus bello
- ОС: Debian GNU/Linux
Re: связка find xargs mv
Пишите правильно:
в консоли вку́пе (с чем-либо) в общем вообще | в течение (часа) новичок нюанс по умолчанию | приемлемо проблема пробовать трафик |
-
- Модератор
- Сообщения: 4823
- Статус: фанат консоли (=
- ОС: GNU/Debian, RHEL
Re: связка find xargs mv
Так ограничьте 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.
The more you believe you don't do mistakes, the more bugs are in your code.
-
- Сообщения: 34
- ОС: Ubuntu 14.04lts
Re: связка find xargs mv
Bizdelnick, если бы всё было так просто, я не писал бы на форумах.
Не знал какой ман глядеть вообще. Изначально нагуглил тут, думал совместимо...
Насчёт читать маны, процитирую золотые слова, полностью отражающие и моё мнение:
Не знал какой ман глядеть вообще. Изначально нагуглил тут, думал совместимо...
Насчёт читать маны, процитирую золотые слова, полностью отражающие и моё мнение:
По непонятным причинам, маны пишутся так, что понять их можно только зная, что из себе представляет программа и как ей пользоваться. 90% манов всего лишь предостовляют инфу по синтаксису и ключам. Мазохисты может быть и станут разбираться с прогой по манам, но я уже прошел этот этап, и знаю, что это практически бесполезно.
http://www.linux.org.ru/forum/development/...comment-4013871
Начинающий пингвин.
-
- Сообщения: 34
- ОС: Ubuntu 14.04lts
Re: связка find xargs mv
Благодарю. Но такая вот конструкция всё равно только добавляет к имеющемуся имени новое.
find . *.jpg -maxdepth 0 -type f -exec mv -i {} news-$(date +%Y%m%d-%H%M%S)_{} \;
На выходе:
news-20160621-174649_СТАРОЕ ИМЯ.jpg
Откуда взялось "_СТАРОЕ ИМЯ" и как его избежать, скажите пожалуйста.
Начинающий пингвин.
-
- Модератор
- Сообщения: 21033
- Статус: nulla salus bello
- ОС: Debian GNU/Linux
Re: связка find xargs mv
Как обычно — тот, который установлен в Вашей системе.
Правильно, для других случаев есть более полная документация. См. в частности info coreutils (онлайн-версия) или какую-нибудь хорошую книжку, которых есть в количестве. А вот что забыли написать на ЛОРе, так это самое главное: не зная, что из себя представляет программа и как ей пользоваться, пытаться её использовать категорически противопоказано. Вы вот чуть было не потёрли все свои картинки.
Пишите правильно:
в консоли вку́пе (с чем-либо) в общем вообще | в течение (часа) новичок нюанс по умолчанию | приемлемо проблема пробовать трафик |
-
- Модератор
- Сообщения: 21033
- Статус: nulla salus bello
- ОС: Debian GNU/Linux
Re: связка find xargs mv
Что Вы делаете, можете объяснить? Это бессмыслица — передавать find каталог (.), ограничивать глубину вложенности 0 (-maxdepth 0) и заставлять его искать только файлы (-type f).
Оно взялось из {}. Если Вы его уберёте, повторю в который уже раз, имя целевого файла всегда будет всегда одно и то же, и Вы в итоге затрёте все файлы кроме одного (если файлов много или они большие, так что процесс займёт больше секунды, то нескольких).
Пишите правильно:
в консоли вку́пе (с чем-либо) в общем вообще | в течение (часа) новичок нюанс по умолчанию | приемлемо проблема пробовать трафик |
-
- Сообщения: 34
- ОС: Ubuntu 14.04lts
Re: связка find xargs mv
Bizdelnick, ну я не полный дебил, я их предварительно забэкапил уровнем выше, да и экспериментирую на отдельном десятке файлов в другой подпапке)
А зная, что из себя представляет программа и как ей пользоваться, ман нужен только как справочник. Поэтому не понимаю, зачем вместо описания работы с командой посылают читать справочник.Это как вместо автошколы посылать читать инструкцию по эксплуатации автомобилем.
А зная, что из себя представляет программа и как ей пользоваться, ман нужен только как справочник. Поэтому не понимаю, зачем вместо описания работы с командой посылают читать справочник.Это как вместо автошколы посылать читать инструкцию по эксплуатации автомобилем.
Начинающий пингвин.
-
- Модератор
- Сообщения: 21033
- Статус: nulla salus bello
- ОС: Debian GNU/Linux
Re: связка find xargs mv
Вот Вам готовое решение, я сегодня добрый, а картинки, право же, ни в чём не виноваты: for file in *.jpg; do mv -bv "$file" "news-$(date -r "$file" +%Y%m%d-%H%M%S).jpg" ; done
Но послушайте совета: не вбивайте в консоль какие бы то ни было команды, если не понимаете, что они делают.
Кто ж знал, что Вы без прав за руль сели...
Но послушайте совета: не вбивайте в консоль какие бы то ни было команды, если не понимаете, что они делают.
Кто ж знал, что Вы без прав за руль сели...
Пишите правильно:
в консоли вку́пе (с чем-либо) в общем вообще | в течение (часа) новичок нюанс по умолчанию | приемлемо проблема пробовать трафик |
-
- Сообщения: 34
- ОС: Ubuntu 14.04lts
Re: связка find xargs mv
Извините, не знал,что за линуксы нынче без сертификата садиться нельзя...
Не сработало к сожалению:
$ 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~
Не сработало к сожалению:
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~
Начинающий пингвин.
-
- Модератор
- Сообщения: 21033
- Статус: nulla salus bello
- ОС: Debian GNU/Linux
Re: связка find xargs mv
Прошу прощения, опечатался — пробел пропустил. Исправил в предыдущем сообщении.
Пишите правильно:
в консоли вку́пе (с чем-либо) в общем вообще | в течение (часа) новичок нюанс по умолчанию | приемлемо проблема пробовать трафик |
-
- Сообщения: 34
- ОС: Ubuntu 14.04lts
Re: связка find xargs mv
Опять что-то не так.
На выходе некоторые файлы получаются с тильдой в расширении (news-20160620-223935.jpg~) : вероятно одинаковая дата вплоть до секунды.
Как бы добавлять в случае одинаковой даты 1,2,3,.. в имя, а не "~" в расширение?
На выходе некоторые файлы получаются с тильдой в расширении (news-20160620-223935.jpg~) : вероятно одинаковая дата вплоть до секунды.
Как бы добавлять в случае одинаковой даты 1,2,3,.. в имя, а не "~" в расширение?
Начинающий пингвин.
-
- Модератор
- Сообщения: 21033
- Статус: nulla salus bello
- ОС: Debian GNU/Linux
Re: связка find xargs mv
Да, именно на этот случай я и добавил опцию -b для mv.
mv умеет добавлять только суффикс, в середину имени он ничего вставить не может. Тут надо писать более хитрый скрипт.
Пишите правильно:
в консоли вку́пе (с чем-либо) в общем вообще | в течение (часа) новичок нюанс по умолчанию | приемлемо проблема пробовать трафик |
-
- Сообщения: 34
- ОС: Ubuntu 14.04lts
Re: связка find xargs mv
Может тогда использовать не mv? Посоветуйте пожалуйста. Хотелось бы изящное решение, чтобы в копилку пошло, не хочу костыли придумывать.
Начинающий пингвин.
-
- Модератор
- Сообщения: 21033
- Статус: nulla salus bello
- ОС: Debian GNU/Linux
Re: связка find xargs mv
А я разве предлагал костыли?
Так или иначе, сначала определитесь, во что Вы хотите переименовывать файлы.
Так или иначе, сначала определитесь, во что Вы хотите переименовывать файлы.
Пишите правильно:
в консоли вку́пе (с чем-либо) в общем вообще | в течение (часа) новичок нюанс по умолчанию | приемлемо проблема пробовать трафик |
-
- Сообщения: 34
- ОС: Ubuntu 14.04lts
Re: связка find xargs mv
Поскольку выяснилось, что дата-время у половины из них не уникальны, то я уже и не знаю =( Просто порядково пронумеровать не хотелось бы.Можно ли пронумеровать ТОЛЬКО совпадающие?
Начинающий пингвин.
-
- Модератор
- Сообщения: 21033
- Статус: nulla salus bello
- ОС: Debian GNU/Linux
Re: связка find xargs mv
Можно всё что угодно. Но это уже будет заметно сложнее.
Пишите правильно:
в консоли вку́пе (с чем-либо) в общем вообще | в течение (часа) новичок нюанс по умолчанию | приемлемо проблема пробовать трафик |
-
- Сообщения: 3408
- Статус: аватар-невидимка
- ОС: openSUSE Tumbleweed x86_64
Re: связка find xargs mv
Работать будет только в 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 , дополненное хешем для проверки совпадений до переименования.
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 , дополненное хешем для проверки совпадений до переименования.
-
- Сообщения: 34
- ОС: Ubuntu 14.04lts
Re: связка find xargs mv
Спасибо большое. Хороший пример для изучения.
Такие были ошибки:
mv: неверный ключ — «5»
По команде «mv --help» можно получить дополнительную информацию.
mv: неверный ключ — «m»
По команде «mv --help» можно получить дополнительную информацию.
mv: неверный ключ — «d»
По команде «mv --help» можно получить дополнительную информацию.
Эти файлы остались без переименования:
-nnd73fkh3q.jpg
-fmphxq8y5g.jpg
deni_zahitnika_otechestva.png
a_002.JPG a.JPG
-5lpqfiqifm.jpg
310.JPG
Остальное ок.
Такие были ошибки:
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
Остальное ок.
Начинающий пингвин.
-
- Модератор
- Сообщения: 21033
- Статус: nulla salus bello
- ОС: Debian GNU/Linux
Re: связка find xargs mv
Чтобы имена файлов, начинающиеся с дефиса, не воспринимались mv как опции, надо заменить mv "$file" "news-$name.jpg" на mv -- "$file" "news-$name.jpg". Остальные файлы просто не соответствуют маске *.jpg, потому и не переименовались.
Пишите правильно:
в консоли вку́пе (с чем-либо) в общем вообще | в течение (часа) новичок нюанс по умолчанию | приемлемо проблема пробовать трафик |
-
- Сообщения: 34
- ОС: Ubuntu 14.04lts
Re: связка find xargs mv
Большое спасибо, так работает. Ведь никогда не знаешь, как там клиенту на душу положило файлы обозвать)
А как избежать ошибки:
mv: «nws-234413-001.jpg» и «nws-234413-001.jpg» - один и тот же файл
Чтобы если есть -001 начинал с -002, либо с -003, если -002 занят?
А как избежать ошибки:
mv: «nws-234413-001.jpg» и «nws-234413-001.jpg» - один и тот же файл
Чтобы если есть -001 начинал с -002, либо с -003, если -002 занят?
Начинающий пингвин.
-
- Сообщения: 34
- ОС: Ubuntu 14.04lts
Re: связка find xargs mv
А ещё не удаётся пакетно переименовать файлы в верхнем регисте. Не срабатывает:
rename 'y/A-Z/a-z/' *
rename 'y/A-Z/a-z/' *.JPG
rename 's/\.JPG$/\.jpg/' *.JPG
UPD.: Кажется я догадываюсь, в чём дело. у меня есть файлы с одинаковыми именами с разницей лишь в регистре расширения. Переименовал вручную. Но как быть, если их много?
rename 'y/A-Z/a-z/' *
rename 'y/A-Z/a-z/' *.JPG
rename 's/\.JPG$/\.jpg/' *.JPG
UPD.: Кажется я догадываюсь, в чём дело. у меня есть файлы с одинаковыми именами с разницей лишь в регистре расширения. Переименовал вручную. Но как быть, если их много?
Начинающий пингвин.
-
- Модератор
- Сообщения: 21033
- Статус: nulla salus bello
- ОС: Debian GNU/Linux
Re: связка find xargs mv
Вот тут вопрос в том, что у Вас скрывается под именем rename, потому что есть две утилиты с таким названием. Попробуйте так: prename 'y/A-Z/a-z/' *
Пишите правильно:
в консоли вку́пе (с чем-либо) в общем вообще | в течение (часа) новичок нюанс по умолчанию | приемлемо проблема пробовать трафик |
-
- Сообщения: 34
- ОС: Ubuntu 14.04lts
Re: связка find xargs mv
Не знаю, что у меня скрывается, ведь /? ему не скажешь, в теле есть слова: "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.
Если не сильно обеспокоит...
$ ls -all /usr/bin/rename
lrwxrwxrwx 1 root root 24 янв. 13 04:06 /usr/bin/rename -> /etc/alternatives/rename
Ваш вариант с "К" помог, большое спасибо!
Меня ещё беспокоит ответ на сообщение #25.
Если не сильно обеспокоит...
Начинающий пингвин.
-
- Сообщения: 3408
- Статус: аватар-невидимка
- ОС: openSUSE Tumbleweed x86_64
Re: связка find xargs mv
Проще всего сначала все файлы переименовать в нейтральные имена, вроде 1.jpg ... n.jpg (или "хеш файла".jpg), а потом уже переименовывать по дате/времени. Можно, конечно, и скрипт этим озаботить, но что если файл имеет имя nws-234413-001.jpg, а по времени в дальнейшем будет переименован в nws-234545.jpg ?
-
- Модератор
- Сообщения: 21033
- Статус: nulla salus bello
- ОС: Debian GNU/Linux
Re: связка find xargs mv
Вы не поверите, но в man rename всё написано.
Пишите правильно:
в консоли вку́пе (с чем-либо) в общем вообще | в течение (часа) новичок нюанс по умолчанию | приемлемо проблема пробовать трафик |