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


Увидели сообщение с непонятной ссылкой, спам, непристойность или оскорбление?
Воспользуйтесь ссылкой «Сообщить модератору» рядом с сообщением!

Автор Тема: терминал find найти в папке файлы по условиям и скопировать в другую папку  (Прочитано 161585 раз)

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

Оффлайн FindTo

  • Автор темы
  • Новичок
  • *
  • Сообщений: 13
  • Эти ваши не понимать
    • Просмотр профиля
терминал find найти в папке файлы по условиям и скопировать в другую папку


задача скрипта - все файлы папки(/home/media) и её подпапок с заданным расширением(mp3) надо найти и отправить во временную папку(/home/media/tmp) для конвертации.

всё хорошо если среди найденных(mp3) файлов нет одноимённых и дубликатов, если есть, надо поместить их во временную папку с другим именем(желательно добавить к основному имени подчеркивание и диапазон чисел от 00001 до 99999)



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

ДУБЛИКАТЫ - это файлы у которых одинаковые имена размеры и хэш

ОДНОИМЁННЫЕ - это файлы у которых совпадают имена, но не совпадает хэш - их надо переименовывать и добавлять



======================================
разложу по пунктам для ясности:

указание исходной папки
papka="/home/media
создание временной папки
mkdir -p "$papka/tmp"tmppapka="$papka/tmp"
указание расширения нужных файлов
rassh=mp3
в указаной папке поиск файлов с указанным расширением
poisk=$(find $papka -type f -iname "*.$rassh" | wc -l)
в указанной папке поиск одноимённых файлов с указанным расширением
dubli=$(find $papka -iname "*.$rassh" -type f -printf '%f\n' | sort | uniq -d | xargs -i find $papka -type f -iname {} | wc -l)
(необязательно но желательно) проверка на дубликаты

переименование одноимённых по маске исходноеИмя_00001 и так далее

копирование переименованных файлов во временную папку
======================================


сам скрипт, без команд конвертации и отправления файлов в конвертор, только вступительная и заключительная часть:

#! /bin/bash

rassh=mp3

papka="/home/media"

cd $papka

mkdir -p "$papka/tmp"

tmppapka="$papka/tmp"

poisk=$(find $papka -type f -iname "*.$rassh" | wc -l)

dubli=$(find $papka -iname "*.$rassh" -type f -printf '%f\n' | sort | uniq -d | xargs -i find $papka -type f -iname {} | wc -l)

dublisp=$(find $papka -iname "*.$rassh" -type f -printf '%f\n' | sort | uniq -d | xargs -i find $papka -type f -iname {} | grep \/ || echo "подходящие под условие файлы отсутствуют!")

tmppoisk=$(find $tmppapka -type f -iname "*.$rassh")

echo "папка
${papka}

содержит ${poisk} файлов с расширением ${rassh}

из них с одинаковыми именами ${dubli}

список файлов с одинаковыми именами и расширением ${rassh} :
${dublisp}

дубликаты файлов с расширением ${rassh} переименованы:
${tmppoisk}
"


ну и вот с этой частью нужна помощь:

(необязательно но желательно) проверка на дубликаты

переименование одноимённых по маске исходноеИмя_00001 и так далее

копирование переименованных файлов во временную папку


то что всё это одной командой и начинается она с "find" - это всё что я могу понять. В интернете были найдены варианты, но не срабатывали.



« Последнее редактирование: 11 Января 2023, 01:59:41 от FindTo »
Неофит извращений чёрных экранов.

Оффлайн qpdb

  • Забанен
  • Активист
  • *
  • Сообщений: 628
  • xUbuntu 22.04
    • Просмотр профиля
(необязательно но желательно) проверка на дубликаты
Пока отреагирую только на это.

Дубликаты это файлы с одним и тем же именем или файлы одного и того же содержания?
Если речь идёт об одинаковых именах это в общем-то как-то можно победить, а вот что делать с одинаковым содержанием не знаю, никогда не сталкивался.

Я с самого начала предлагал собрать файлы с которыми предстоит работа в одну директорию и присвоить им уникальный префикс.
Вот это ⮟⮟⮟
переименование одноимённых по маске исходноеИмя_00001 и так далее
потом легче будет делать с помощью команды rename

А вообще это у Вас одноразовый проект или предстоит многократная подобная задача в течение длительного времени?

2023 Jan 11; 12:14 AM

Оффлайн andytux

  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 7852
    • Просмотр профиля
Вы невнимательны!
Цитировать
Дубликаты это файлы с одним и тем же именем или файлы одного и того же содержания?
Цитировать
ДУБЛИКАТЫ - это файлы у которых одинаковые имена размеры и хэш

Оффлайн F12

  • Администратор
  • Старожил
  • *
  • Сообщений: 5496
    • Просмотр профиля
ДУБЛИКАТЫ - это файлы у которых одинаковые имена размеры и хэш

ОДНОИМЁННЫЕ - это файлы у которых совпадают имена, но не совпадает хэш - их надо переименовывать и добавлять
- в принципе ничего невыполнимого нет, тем более, что в параллельной теме уже разобрались, как в заданной директории "фильтровать" файлы по расширению и имени, теперь осталось вплести в алгоритм процедуры определения их размера, и вычисления хэшей
   ... делов-то ;)
      ... но все равно требуется некоторое количество свободного времени, как впрочем и желания, либо мотивации :)
         ... думаю, в той или иной мере, все это у тебя имеется, поэтому дерзай, а будут возникать какие-то конкретные моменты, пиши, будем всем Форумом разбираться

ЗЫЖ но прежде, если не знаком, то рекомендую познакомиться с вот этим, своего рода Талмудом

Оффлайн FindTo

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

Память у меня попугайчика, а умения составлять из команд и операторов работающую последовательность на нуле.

Проявите снисхождение к инвалиду мозга  :coolsmiley:
проект у меня один, закончу скрипт и буду пользовать им до десятков тысяч файлов.
Потому и имен пространство от 00001 до 99999

там осталось только то что в заголовке этой темы, ну и немного с кавычками поборюсь.

Всем заранее спасибо, пойду "талмуд" мучать.

« Последнее редактирование: 11 Января 2023, 17:42:11 от FindTo »
Неофит извращений чёрных экранов.

Оффлайн ALiEN

  • Администратор
  • Старожил
  • *
  • Сообщений: 7722
  • We were here
    • Просмотр профиля
Цитировать
все файлы папки(/home/media) и её подпапок с заданным расширением(mp3) надо найти и отправить во временную папку(/home/media/tmp) для конвертации.

примерно набросал:
#!/bin/bash
SRC='/home/media'
DEST='/home/media/tmp'

NUM=100000
while read MP3; do
  if [ -e "$DEST/${MP3##*/}" ]; then
    NUM=$(( NUM + 1 ))
    echo cp -v "$MP3" "$DEST/${NUM:1:5}_${MP3##*/}" ;
      else
    echo cp -v "$MP3" "$DEST/${MP3##*/}"
  fi
done < <(find "$SRC" -not \( -path "$DEST" -prune \) -type f -iname "*.mp3" )
Только вывод в терминал, без действий над файлами. Если в терминале всё ОК, уберите echo перед cp.

Дубликаты по содержимому в папке можно выцепить через чексумму, например
md5sum ./* | sort | uniq -d -w32
🖥 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

Оффлайн qpdb

  • Забанен
  • Активист
  • *
  • Сообщений: 628
  • xUbuntu 22.04
    • Просмотр профиля
просто если поиском искать любой запрос про дубликаты, то сначала дадут рекламки, а потом тотал командера насыпят
А Вы пробуйте сразу поисковый запрос на английский переводить, это не только потому, что на английском всего больше, но и из за  особенностей языка.
Мы редко ищем глаголы, а в прилагательных и существительных английского языка падежей и родов нет.
How to Find and Remove Duplicate Files in Linux
А дальше переводите с помощью автоматических переводчиков, если нужно…
2023 Jan 11; 12:12 PM


Оффлайн FindTo

  • Автор темы
  • Новичок
  • *
  • Сообщений: 13
  • Эти ваши не понимать
    • Просмотр профиля
примерно набросал:
он должен вывести новые имена файлов? С номерами?

Выводит старая папка старое имя файла новая папка старое имя файла

новое имя файла не выводит. Лучше сразу пишите скрипт с действием, мне так проще будет разобратся, echo на move to или что там, менять не очень умею .

Сначала запускал sh script.shполучал ошибку синтаксиса перенаправлений(как то так)
потом попробовал bash script.shзапускается, но имена пишет старые.

Как то так.



А такой алгоритм имеет место жить?
(Нажмите, чтобы показать/скрыть)
Неофит извращений чёрных экранов.

Оффлайн ALiEN

  • Администратор
  • Старожил
  • *
  • Сообщений: 7722
  • We were here
    • Просмотр профиля
он должен вывести новые имена файлов? С номерами?
Выводит выполняемую команду.
Разбор:
cp -v /home/alien/Музыка/Harry Mack - Ruins Theme (18kj).mp3 /home/alien/Музыка/tmp/Harry Mack - Ruins Theme (18kj).mp3
файл Harry Mack - Ruins Theme (18kj).mp3 будет скопирован из /home/alien/Музыка/ в /home/alien/Музыка/tmp/

cp -v /home/alien/Музыка/Mae Whitman - Semi Sacred Geometry.mp3 /home/alien/Музыка/00001_Mae Whitman - Semi Sacred Geometry.mp3
файл Mae Whitman - Semi Sacred Geometry.mp3 будет скопирован из /home/alien/Музыка/ в /home/alien/Музыка/tmp/ c добавлением цифрового префикса 00001, т.к. в /home/alien/Музыка/tmp/ уже есть файл Mae Whitman - Semi Sacred Geometry.mp3



#!/bin/bash
SRC='/home/media'                                     # переменная - откуда копируем
DEST='/home/media/tmp'                                # переменная - куда копируем

NUM=100000                                            # нумерация с 00000
while read MP3; do                                    # читаем построчно команду, после 'done'
  if [ -e "$DEST/${MP3##*/}" ]; then                  # если файл существует в месте назначения
    NUM=$(( NUM + 1 ))                                # прибавляем к нумерации единичку
    echo cp -v "$MP3" "$DEST/${NUM:1:5}_${MP3##*/}" ; # копируем с цифровым префиксом, избавившись от первой единицы (100001 -> 00001)
      else                                            # иначе
    echo cp -v "$MP3" "$DEST/${MP3##*/}"              # просто копируем, ${MP3##*/} - имя файла без полного пути
  fi                                                  # "если" кончилось
done < <(find "$SRC" -not \( -path "$DEST" -prune \) -type f -iname "*.mp3" )
# конец цикла со вставленным в него списком файлов из find
# -not \( -path "$DEST" -prune \) - пропуск папки "$DEST", т.к. она вложена в "$SRC"

echo на move to или что там, менять не очень умею .
Просто убрать echo.

Пользователь добавил сообщение 11 Января 2023, 23:36:44:
+ две хороших ссылки
https://www.opennet.ru/docs/RUS/bash_scripting_guide/
https://habr.com/ru/company/vk/blog/311762/
« Последнее редактирование: 11 Января 2023, 23:36:44 от 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

Оффлайн FindTo

  • Автор темы
  • Новичок
  • *
  • Сообщений: 13
  • Эти ваши не понимать
    • Просмотр профиля
ALiEN175,

/home/media без /tmp
до скрипта:
Цитировать
ls -R                            .:
000
12_sektor_gaza_pesenka_lalala_remix.mp3
Dharma.mp3

./000:
Dharma.mp3             sakamoto
bootaudio.mp3          z_VolumeRingTone1.mp3
bootaudio_gemini1.mp3  z_VolumeRingTone2.mp3
bootaudio_gemini2.mp3  z_VolumeRingTone3.mp3

./000/sakamoto:
 12_sektor_gaza_pesenka_lalala_remix.mp3
 Dharma.mp3
 Forest.mp3
'Nokia Ryuichi.mp3'
'ring Dharma.mp3'

действие скрипта:
bash "/home/09.sh"
'/home/media/000/bootaudio.mp3' -> '/home/media/tmp/bootaudio.mp3'
'/home/media/000/bootaudio_gemini1.mp3' -> '/home/media/tmp/bootaudio_gemini1.mp3'
'/home/media/000/bootaudio_gemini2.mp3' -> '/home/media/tmp/bootaudio_gemini2.mp3'
'/home/media/000/z_VolumeRingTone1.mp3' -> '/home/media/tmp/z_VolumeRingTone1.mp3'
'/home/media/000/z_VolumeRingTone2.mp3' -> '/home/media/tmp/z_VolumeRingTone2.mp3'
'/home/media/000/z_VolumeRingTone3.mp3' -> '/home/media/tmp/z_VolumeRingTone3.mp3'
'/home/media/000/sakamoto/Dharma.mp3' -> '/home/media/tmp/Dharma.mp3'
'/home/media/000/sakamoto/Forest.mp3' -> '/home/media/tmp/Forest.mp3'
'/home/media/000/sakamoto/Nokia Ryuichi.mp3' -> '/home/media/tmp/Nokia Ryuichi.mp3'
'/home/media/000/sakamoto/ring Dharma.mp3' -> '/home/media/tmp/ring Dharma.mp3'
'/home/media/000/sakamoto/12_sektor_gaza_pesenka_lalala_remix.mp3' -> '/home/media/tmp/12_sektor_gaza_pesenka_lalala_remix.mp3'
'/home/media/000/Dharma.mp3' -> '/home/media/tmp/00000_Dharma.mp3'
'/home/media/Dharma.mp3' -> '/home/media/tmp/00000_Dharma.mp3'
'/home/media/12_sektor_gaza_pesenka_lalala_remix.mp3' -> '/home/media/tmp/00000_12_sektor_gaza_pesenka_lalala_remix.mp3'


/home/media/tmp
после скрипта:
Цитировать
ls -R                             .:
 00000_12_sektor_gaza_pesenka_lalala_remix.mp3
 00000_Dharma.mp3
 12_sektor_gaza_pesenka_lalala_remix.mp3
 Dharma.mp3
 Forest.mp3
'Nokia Ryuichi.mp3'
 bootaudio.mp3
 bootaudio_gemini1.mp3
 bootaudio_gemini2.mp3
'ring Dharma.mp3'
 z_VolumeRingTone1.mp3
 z_VolumeRingTone2.mp3
 z_VolumeRingTone3.mp3



переименовывается не та часть файла

не все дубликаты нумеруются - возможно на каждую подпапку надо новый проход делать

вот строчки интересные:
'/home/media/000/Dharma.mp3' -> '/home/media/tmp/00000_Dharma.mp3'
'/home/media/Dharma.mp3' -> '/home/media/tmp/00000_Dharma.mp3'
в одну папку отправилось два одноимённых файла, и один просто скушался по заветам линукса
Неофит извращений чёрных экранов.

Оффлайн qpdb

  • Забанен
  • Активист
  • *
  • Сообщений: 628
  • xUbuntu 22.04
    • Просмотр профиля
не все дубликаты нумеруются - возможно на каждую подпапку надо новый проход делать
Я не специалист в области информационных технологий, но когда я ещё работал то указанию руководства мы оцифровывали документацию, всякие бумаги, и разгребали то, что по русски называют „файлопомойком”.

Очень много файлов с названиями «project», «le projet», и прочими распространёнными, потом документы с иероглифами, на арабском и иногда даже на иврите.

Желательно все интересующие файлы собрать в одну директорию, наверное есть много способов, я делал так как в моём первом сообщении. Лучше потом  всё как-то подвергнуть транслитерацей или как-то по другому понятно переименовать после этого уже приступить к обработке.

Попытка что-то делать не извлекая файлы в отдельную директорию всё время порождала какие-то ошибки.

Поздно у нас некогда проверять на русский, будут ошибки😞…

2023 Jan 12; 12:52 AM; Oakville, ON, Canada.
 

Оффлайн FindTo

  • Автор темы
  • Новичок
  • *
  • Сообщений: 13
  • Эти ваши не понимать
    • Просмотр профиля
qpdb, так это и пытаемся сделать, все файлы в папку tmp не теряя одноимённые
пока что не получается
Неофит извращений чёрных экранов.

Оффлайн ALiEN

  • Администратор
  • Старожил
  • *
  • Сообщений: 7722
  • We were here
    • Просмотр профиля
FindTo, интересно, воссоздал вашу структуру:
(Нажмите, чтобы показать/скрыть)
Результат:bash ~/mp3test.sh
'/home/alien/test/Dharma.mp3' -> '/home/alien/test/tmp/Dharma.mp3'
'/home/alien/test/12_sektor_gaza_pesenka_lalala_remix.mp3' -> '/home/alien/test/tmp/12_sektor_gaza_pesenka_lalala_remix.mp3'
'/home/alien/test/000/bootaudio_gemini1.mp3' -> '/home/alien/test/tmp/bootaudio_gemini1.mp3'
'/home/alien/test/000/Dharma.mp3' -> '/home/alien/test/tmp/00001_Dharma.mp3'
'/home/alien/test/000/z_VolumeRingTone3.mp3' -> '/home/alien/test/tmp/z_VolumeRingTone3.mp3'
'/home/alien/test/000/bootaudio_gemini2.mp3' -> '/home/alien/test/tmp/bootaudio_gemini2.mp3'
'/home/alien/test/000/sakamoto/Forest.mp3' -> '/home/alien/test/tmp/Forest.mp3'
'/home/alien/test/000/sakamoto/Dharma.mp3' -> '/home/alien/test/tmp/00002_Dharma.mp3'
'/home/alien/test/000/sakamoto/Nokia Ryuichi.mp3' -> '/home/alien/test/tmp/Nokia Ryuichi.mp3'
'/home/alien/test/000/sakamoto/12_sektor_gaza_pesenka_lalala_remix.mp3' -> '/home/alien/test/tmp/00003_12_sektor_gaza_pesenka_lalala_remix.mp3'
'/home/alien/test/000/sakamoto/ring Dharma.mp3' -> '/home/alien/test/tmp/ring Dharma.mp3'
'/home/alien/test/000/z_VolumeRingTone2.mp3' -> '/home/alien/test/tmp/z_VolumeRingTone2.mp3'
'/home/alien/test/000/z_VolumeRingTone1.mp3' -> '/home/alien/test/tmp/z_VolumeRingTone1.mp3'
'/home/alien/test/000/bootaudio.mp3' -> '/home/alien/test/tmp/bootaudio.mp3'
Всё переименовывается корректно.
🖥 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

Оффлайн FindTo

  • Автор темы
  • Новичок
  • *
  • Сообщений: 13
  • Эти ваши не понимать
    • Просмотр профиля
может чё из кода убегает?
Да недолжно поидее.

Прикрепите файл скрипта, попробую.
Может мой редактор косячит.
Неофит извращений чёрных экранов.

Оффлайн ALiEN

  • Администратор
  • Старожил
  • *
  • Сообщений: 7722
  • We were here
    • Просмотр профиля
Прикрепил
🖥 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

 

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