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


Автор Тема: Поиск каталогов, одновременно содержащих файлы определенных типов  (Прочитано 1122 раз)

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

kalbaskin

  • Автор темы
  • Гость
Доброго дня!
Дорогие, помогите пожалуйста решить мою задачу.

На жестком диске есть огромный каталог музыки. Надо идентифицировать (вывести на экран) с полными путями только те директории, в которых одновременно присутствуют и файлы с расширением .mp3, и другого формата, например, .flac.


Ковырялся с "find", гуглил... не хватает своих мозгов для консоли.

Заранее спасибо!




Профиль ТС (пользователь kalbaskin) по состоянию на 21/11/2019 на форуме более не существует. Модератором раздела принято решение закрыть тему.
--zg_nico
« Последнее редактирование: 21 Ноября 2019, 17:28:42 от zg_nico »

Оффлайн yumisst

  • Забанен
  • Любитель
  • *
  • Сообщений: 77
    • Просмотр профиля
:~$ cd #Переход в родительскую директорию
:~ $ find . | grep '[\.mp3]' && find . | grep '[\.(и что там еще)]'

должно работать.

kalbaskin

  • Автор темы
  • Гость
Спасибо, yumisst, попробовал. Не получилось. Выводит все файлы скопом.

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

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

Оффлайн yumisst

  • Забанен
  • Любитель
  • *
  • Сообщений: 77
    • Просмотр профиля
А... Врубился, что ты хочешь сделать!
Ну, тогда алгоритм такой. Делаем два прохода и заносим в файл вначале абсолютные пути с первым расширением, затем добавляем таким же образом абсолютные пути со вторым расширением. Далее из файла дергаем все это дело обрубая расширение и вычисляем все совпадения (конечно все это дело нумеруем), после чего, получаем только уникальные пары с первым и вторым расширением. Потом остается лишь выбрать какой файл из найденной пары удалить, либо удалить оба сразу...

Что-то типа такого получится:
:~$ find / | grep '[\.]mp3' > ~/file
:~$ find / | grep '[\.]исходник' >> ~/file
:~$ cut -d . -f1 file > file_1
:~$ cat file_1 | sort -u | awk '{print NR, $1}' > file_2
:~$ cat file_1 | sort -u | xargs -i grep -Fxc {} file_1 | awk '{print NR, $1 }' > file_3
:~$ join file_2 file_3 | awk '{ print $2, "-->", $3 }' | grep '\--> 2'

Все что на выходе твой мусор.



« Последнее редактирование: 20 Ноября 2016, 02:05:42 от yumisst »

Оффлайн Azure

  • Почётный модератор
  • Старожил
  • *
  • Сообщений: 6017
  • Windows10, i3wm on Debian9, Manjaro20.0
    • Просмотр профиля
Если не надо сравнивать именно дубликатыfind $(find -type f -name '*.flac' -printf '%h\n' | sort -u) -type f -name '*.mp3' -delete
В Линукс можно сделать ВСЁ что угодно, достаточно знать КАК !

Оффлайн yumisst

  • Забанен
  • Любитель
  • *
  • Сообщений: 77
    • Просмотр профиля
find $(find -type f -name '*.flac' -printf '%h\n' | sort -u) -type f -name '*.mp3' -delete
так удалишь все что встретится с расширением mp3

Оффлайн Azure

  • Почётный модератор
  • Старожил
  • *
  • Сообщений: 6017
  • Windows10, i3wm on Debian9, Manjaro20.0
    • Просмотр профиля
так удалишь все что встретится с расширением mp3
в тех папках где есть .flac вроде как ТС просил… Стоит подстраховаться ограничив вложенность добавивfind $(find -type f -name '*.flac' -printf '%h\n' | sort -u) -max-depth 1 -type f -name '*.mp3' -deleteИ стоит протестировать заменив -delete на -print
В Линукс можно сделать ВСЁ что угодно, достаточно знать КАК !

Оффлайн yumisst

  • Забанен
  • Любитель
  • *
  • Сообщений: 77
    • Просмотр профиля
Я так понял, что нужно удалять именно те файлы, к которым существуют одноименные исходники. В данном случае удаляются все файлы последнего расширения, даже независимо от условия что первое будет присутствовать без предиктового совпадения.

Оффлайн Azure

  • Почётный модератор
  • Старожил
  • *
  • Сообщений: 6017
  • Windows10, i3wm on Debian9, Manjaro20.0
    • Просмотр профиля
Самое интересное, что вот эта конструкция $(find -type f -name '*.flac' -printf '%h\n' | sort -u) обработается как имя переменной, попросту ее можно вырезать, не так ли?
Можно, но зачем?

Пользователь добавил сообщение 20 Ноября 2016, 12:35:30:
удаляются все файлы последнего расширения, даже независимо от условия что первое будет присутствовать без предиктового совпадения.
Читаем внимательно:
Если не надо сравнивать именно дубликаты
Соответствующую оговорку я сделал. Если файлы именно так проименованы (дубли отличающиеся только расширением) то это будет прощеfind -type f -name '*.flac' -exec sh -c 'rm -f ${0%flac}mp3' {} \;или более кошерноfind -type f -name '*.mp3' -exec sh -c 'test -f ${0%mp3}flac' {} \; -deleteДля последнего напоминаю
стоит протестировать заменив -delete на -print

Пользователь добавил сообщение 20 Ноября 2016, 12:44:38:
find -type f -name '*.flac' -exec sh -c 'rm -f ${0%flac}mp3' {} \;
может сильно нагрузить проц/память, поэтому при большом коичестве файлов стоит его слегка модифицироватьfind -type f -name '*.flac' -print0 | sed 's/flac\(\x0\|$\)/mp3\1/g' | xargs -0 rm -f
« Последнее редактирование: 20 Ноября 2016, 12:44:38 от Azure »
В Линукс можно сделать ВСЁ что угодно, достаточно знать КАК !

kalbaskin

  • Автор темы
  • Гость
Жаль, что мне не удалось выполнить данную процедуру силами линуксовых команд.
Нужно было что-то типа этого виндового:

for /R "g:\music\" /D %%i in ("*") do (if exist %%i\*.mp3 if exist %%i\*.flac del /Q "%%i\*.mp3")

Но, не столь важна реализация. Важен результат - мусора больше нет.

Спасибо за отклики и желание помочь!

Оффлайн Azure

  • Почётный модератор
  • Старожил
  • *
  • Сообщений: 6017
  • Windows10, i3wm on Debian9, Manjaro20.0
    • Просмотр профиля
не удалось выполнить данную процедуру силами линуксовых команд.
И что помешало?
find $(find -type f -name '*.flac' -printf '%h\n' | sort -u) -max-depth 1 -type f -name '*.mp3' -deleteИ стоит протестировать заменив -delete на -print
В Линукс можно сделать ВСЁ что угодно, достаточно знать КАК !

kalbaskin

  • Автор темы
  • Гость
Извини, Azure. Просто не работает.

Пишет так:

find: неизвестный предикат «-max-depth»

Поменял -max-depth на -maxdept (судя по справке к find), выдал:

"find: «./123/Tractor»: Нет такого файла или каталога".

Т.е. каталог может содержать и пробелы, ибо исходная папка называлась "Tractor - 1971.1972"
А исходный файл flac или ape, или wav в папке может быть один (например на весь альбом), а mp3-шек с него уйма.

Короче, я сам для себя понял, что задача для терминала - не тривиальная.

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

Я поступил мыслил скорее всего не совсем в "терминах" linux, а по обывательски: берешь очередную папку, смотришь, если в ней есть ОДНОВРЕМЕННО файлы двух расширений, то все файлы с одним расширением просто удаляешь. И решение как-то очень быстро нашлось, но через командный интерпретатор Windowsов. Разобраться в этом вопросе, конечно, хотелось бы, потому что аналогичные задачи встречаются часто и с документами и их архивами...

Я буду рад с удовольствием сказать Огромное человеческое спасибо, если придумается и проверится красивое и простое решение под свободный Linux...

Оффлайн ReNzRv

  • Старожил
  • *
  • Сообщений: 2648
    • Просмотр профиля
Вот еще вариант:
find -type f -name '*.flac' | sed 's/flac$/mp3/' | xargs -d'\n' rm -vf1 - ищем файлы flac, 2 - меняем в конце flac на mp3, удаляем с выводом отчета файлы mp3 если они есть в той же папке где лежит каджый файл flac.

find -type f -name '*.flac' | sed 's/flac$/mp3/' | xargs -d'\n' cp -vt '/path/to/folder'Тоже самое, но скопировать mp3 в /path/to/folder

Оффлайн Azure

  • Почётный модератор
  • Старожил
  • *
  • Сообщений: 6017
  • Windows10, i3wm on Debian9, Manjaro20.0
    • Просмотр профиля
find: «./123/Tractor»: Нет такого файла или каталога
Ну понятно, в именах каталогов пробелы…find -type f -name '*.feed' -printf '%h\n' | sort -u | tr '\n' '\0' | xargs -0i find "{}" -maxdepth 1 -name '*.m3u'
В Линукс можно сделать ВСЁ что угодно, достаточно знать КАК !

 

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