Форум русскоязычного сообщества Ubuntu


Следите за новостями русскоязычного сообщества Ubuntu в Twitter-ленте @ubuntu_ru_loco

Автор Тема: Рекурсивно добавить префикс к именам файлов во всех поддиректориях.  (Прочитано 3033 раз)

0 Пользователей и 1 Гость просматривают эту тему.

zse

  • Автор темы
  • Гость
     — Приветствую всех!
     — У меня возникла необходимость добавить уникальный префикс к каждому имени файла во всех директориях и поддиректория конкретной директории.
     — Пробовал по аналогии.
     — Рекурсивно добавить в конец имени файла что-либо просто…
(Нажмите, чтобы показать/скрыть)
     — Файлы для теста специально имеют такие навзания кириллица спецсимволы и т.п. вложенный директорий на разном уровне много…
     — Понятно, что
find . -type f -exec mv '{}'    '2018Aug01065219_{}' \;
работать не будет потому что в mv попадают файлы типа ./01/02/03/test.txt…
     — Далее делаем каждый файл во всех директория и поддерикториях с уникальным окончанием типа суффикса.
Код: (sh) [Выделить]
find . -name "*_2018Aug01065219" -exec bash -c 'mv "$0" "`echo \"$0\" | sed s/_2018Aug01065219/_•$(date +%s%4N)•_/`"' {} \;
(Нажмите, чтобы показать/скрыть)
     — date +%s%4N создаёт уникальный цифровой индекс в конце файла.
— Мне хотелось бы иметь такой индекс в начале любого файла в любых поддиректория данной директории.
Код: (sh) [Выделить]
15331218725787_---  ---ag 'pattern патерн один паттерн два 1|pattern2.txt     — Но
Код: (sh) [Выделить]
find . -name "*_2018Aug01065219*" -exec bash -c 'mv "$0" "`echo \"$0\" | sed s/\(.*\)\//\1\/$(date +%s%4N_)/`"' {} \;
не даёт желаемого результата, хотя:
Код: (sh) [Выделить]
echo "/01/02/03/---  ---ag 'pattern патерн один паттерн два 1|pattern2.txt"| sed 's/\(.*\)\//\1\/Prefix_/'
/01/02/03/Prefix_---  ---ag 'pattern патерн один паттерн два 1|pattern2.txt
     — Вообще в качестве префикса можно иметь просто положим „2018Aug01065219_“, потом его можно будет заменить на уникальный типа date +%s%4N
     — Что ещё попробовать? Я не программист и навыки мои в составлении команд весьма скромные 😞


Оффлайн victor00000

  • Старожил
  • *
  • Сообщений: 15568
  • Глухонемой (Deaf)
    • Просмотр профиля
echo -e "1\n2\n3" | xargs -I {} echo "file {}"
« Последнее редактирование: 01 Августа 2018, 17:00:18 от victor00000 »
Wars ~.o

Оффлайн ALiEN

  • Администратор
  • Старожил
  • *
  • Сообщений: 6739
  • 20% Cooler
    • Просмотр профиля
Код: (bash) [Выделить]
#!/bin/bash

DIR="$HOME/tests" ### Изменить на нужное
PREFIX="$(date +%d-%m-%y)___" ### Изменить на нужное

while read FILE; do
FPTH="$(dirname -- "$FILE")"
NAME="$(basename -- "$FILE")"
mv -v "$FPTH/$NAME" "$FPTH/$PREFIX$NAME"
done < <(find "$DIR" -type f)
« Последнее редактирование: 01 Августа 2018, 16:53:28 от ALiEN175 »
🖥 AsRock B550M Pro4 :: AMD Ryzen 5 3600 :: 16 GB DDR4 :: AMD Radeon RX 6600 :: XFCE
💻 ACER 5750G :: Intel Core i5-2450M :: 6 GB DDR3 :: GeForce GT 630M :: XFCE

zse

  • Автор темы
  • Гость
     — Спасибо, victor00000, я попробую вариант с xargs!
     — Благодарю, ALiEN175, всё работает, но некоторые особенно „уродливые“ файлы начинающие с пробелов спецсимволов тире и т.п. не получают префикс. Но это ожидаемо. Всё равно такие файлы „нежизнеспособны“ и подлежат переименованию рекурсивно с помощью rename. Что в общем-то несложно.
     — После приведения файлов к виду без пробелов, спецсимволов и кириллицы префикс добавляется ко всем файлам во всех директориях и поддиректориях  без проблем.

Оффлайн Azure

  • Модератор раздела
  • Старожил
  • *
  • Сообщений: 6017
  • Windows10, i3wm on Debian9, Manjaro20.0
    • Просмотр профиля
подлежат переименованию рекурсивно с помощью rename
Что мешает использовать rename (а лучше даже rename.ul т.к. он как раз для префиксов/суффиксов самое оно) со старта?
Если уж так хочется find то почему не сформировать нужную команду и не "скормить" её xargs?find -type f -printf 'mv "%h/"{,${PREFIX}_}"%f"\n' | bash
В Линукс можно сделать ВСЁ что угодно, достаточно знать КАК !

zse

  • Автор темы
  • Гость
     — Я Вас приветствую,Azure, давно не виделись!
а лучше даже rename.ul т.к. он как раз для префиксов/суффиксов самое оно
     — Общение с Вами всегда имеет для меня практическую пользу, вот узнал что существует ещё и rename.ul!
     — Почему возник вопрос:
(Нажмите, чтобы показать/скрыть)
    — Приведенная команда без предварительной обработки файлов (удаление пробелов и спецсимволов) работать не будет😞… Рекурсивно тем более…
Код: [Выделить]
find -type f -printf 'mv "%h/"{,${PREFIX}_}"%f"\n' | bash
(Нажмите, чтобы показать/скрыть)
     — А вообще тема рекурсивной замены, транслитерации имён файлов, суффиксов, префиксов весьма „благодатная“, как говорил один юморист, и разработана на нашем форуме я считаю ещё недостаточно, хотя определённые решения найти можно!

Оффлайн ALiEN

  • Администратор
  • Старожил
  • *
  • Сообщений: 6739
  • 20% Cooler
    • Просмотр профиля
zse, непонятно, почему у вас мой вариант не заработал

Осторожно, длинная портянка:
(Нажмите, чтобы показать/скрыть)
« Последнее редактирование: 02 Августа 2018, 16:21:40 от ALiEN175 »
🖥 AsRock B550M Pro4 :: AMD Ryzen 5 3600 :: 16 GB DDR4 :: AMD Radeon RX 6600 :: XFCE
💻 ACER 5750G :: Intel Core i5-2450M :: 6 GB DDR3 :: GeForce GT 630M :: XFCE

zse

  • Автор темы
  • Гость
     — Так заработало всё, спасибо, ALiEN175, за беспокойство!
— Благодарю, ALiEN175, всё работает, но некоторые особенно „уродливые“ файлы начинающие с пробелов спецсимволов тире и т.п. не получают префикс.
     — Но в какой-то поддиректории я обнаружил файлы без префикса и для уверенности сначала из всех файлов удалил пробелы и спецсимволы, кириллицу на всякий случай переименовал.
     — Может нужно тестировать ещё на предмет к каким файлам не хочет добавлять префикс.
(Нажмите, чтобы показать/скрыть)
    — Выбрал директорию с наибольшим количеством файлов к которым не добавлен префикс 2018Aug02094326. Понятное дело вряд ли кто-то умышленно даст файлам такие имена, сугубо почти теоретический интерес…
    — Во вложении вся моя тестовая директория с „искусственными😈“ файлами.
    — Простите господа, что у ВАС занятых людей отнимаю время!

Оффлайн ALiEN

  • Администратор
  • Старожил
  • *
  • Сообщений: 6739
  • 20% Cooler
    • Просмотр профиля
zse, УМВР
(Нажмите, чтобы показать/скрыть)

Пользователь добавил сообщение 02 Августа 2018, 17:28:43:
А вот с некоторыми файлами с вашего вложения - проблемка, некоторые не хотят переименовываться  :-[

Разобрался - проблема в обратном слеше "\"
достаточно его удвоить для скриптов - и всё ок
Код: (bash) [Выделить]
#!/bin/bash
 
DIR="$HOME/tests" ### Изменить на нужное
PREFIX="$(date +%d-%m-%y)___" ### Изменить на нужное
 
while read FILE; do
FPTH="$(dirname -- "$FILE")"
NAME="$(basename -- "$FILE")"
mv -- "$FPTH/$NAME" "$FPTH/$PREFIX$NAME"
done < <(find "$DIR" -type f | sed 's/\\/\\\\/g')
« Последнее редактирование: 02 Августа 2018, 19:00:55 от ALiEN175 »
🖥 AsRock B550M Pro4 :: AMD Ryzen 5 3600 :: 16 GB DDR4 :: AMD Radeon RX 6600 :: XFCE
💻 ACER 5750G :: Intel Core i5-2450M :: 6 GB DDR3 :: GeForce GT 630M :: XFCE

zse

  • Автор темы
  • Гость
     — Я, ALiEN175, Вам и говорил файлы предельно „эксклюзивные😈“ редкого уродства!😇
     — Но вот таким „эксклюзивным😈“ скриптом тоже редко уродливым переименовываются…
(Нажмите, чтобы показать/скрыть)
    — Пока я остановился на вот этой теме в дальнейшем написании означенного выше скриптёнка:
Код: (sh) [Выделить]
find -name '*_*' -type f -exec bash -c 'mv "$0" "`echo \"$0\" | sed -e s/_\{1,\}/_/g`"' {} \;хотя:
Код: (bash) [Выделить]
echo 'jkjk___ ________________ ____lkjklk____ _____rewer____ __________________.txt'|sed -e 's/_\{1,\}/_/g'
jkjk_ _ _lkjklk_ _rewer_ _.txt
Т.е. из многих подчёркиваний сделать одно, рекурсивно не работает у меня… Буду пробовать rename или xargs, про последний ещё почитать нужно.
     — Ну а в конце уже переименую префиксы на уникальные номера
Код: (sh) [Выделить]
…| sed s/_2018Aug01065219/$(date +%s%4N)_/`"'

Оффлайн Azure

  • Модератор раздела
  • Старожил
  • *
  • Сообщений: 6017
  • Windows10, i3wm on Debian9, Manjaro20.0
    • Просмотр профиля
./find
Эк у Вас команду расколбасило... Что-то лишнее "висело" в строке ввода.
find -name '*[`]*' -type f|rename 's/\`/a1/g'; \
Действительно "скриптище". Найти надо сразу одним find'ом (ну или двумя для символов и кириллицы)find -name "*[А-Яа-я]*" ...В перловом выражении стоит для однобуквенных замен вместо s использовать y
В Линукс можно сделать ВСЁ что угодно, достаточно знать КАК !

zse

  • Автор темы
  • Гость
Эк у Вас команду расколбасило...
     — Спасибо за неравнодушие, Azure!
     — Azure, это в основном для тестирования и для транслитерирования и для замены символов есть более приличные скрипты и команды для составления более красивой „композиции😈“!
Код: (bash) [Выделить]
find . -type f -exec bash -c 'mv "$0" "`echo \"$0\" | sed -e s/[^A-Za-z0-9._-/]/_/g`"' {} \;     — Например это ↑↑↑ есть в конце скрипта (скриптищища😇) для рекурсивной замены. Но мне всё же удавалось создавать такое имя файла об которое данная команда спотыкалась😞…
     — ALiEN175, благодарю, эта композиция работает хорошо, если не сказать отлично! На „кошках😈“ тестирование прошло успешно, начинаю применять. Желаемого результата достиг
(Нажмите, чтобы показать/скрыть)
     — Теперь каждый файл имеет уникальное имя „идентификатор“ типа 15332368123243_!
     — Ещё раз спасибо всем, господа я Вам признателен!!!

Оффлайн ReNzRv

  • Старожил
  • *
  • Сообщений: 2648
    • Просмотр профиля
zse,
Чтобы работало надежно и при любых символах - нужно отказатся от использования оболочки (shell) в пользу чистого ЯП. Например:
(Нажмите, чтобы показать/скрыть)

Оффлайн peregrine

  • FSM
  • СуперМодератор
  • Старожил
  • *
  • Сообщений: 7203
  • Gentoo x64 Ubuntu 16.04.1 x64
    • Просмотр профиля
Что бы работало надежно и при любых символах - нужно отказатся от использования оболочки (shell) в пользу чистого ЯП. Например:
Ага и потом ознакомиться, например, с тем, как питон воспринимает кавычки. От экранирования никуда не деться всё равно.

Оффлайн ReNzRv

  • Старожил
  • *
  • Сообщений: 2648
    • Просмотр профиля
peregrine,
Нет, не все равно  :) Perl без проблем работает c именами файлов c любыми символами, хоть с кавычками, хоть с new line))

 

Страница сгенерирована за 0.059 секунд. Запросов: 25.