LINUX.ORG.RU

Рекурсивный mv с сохранением структуры каталогов возможен?


0

1

Приветствую, о глубокоуважаемый Олл!

Предистория: битые mp3 в коллекции. mp3diags отказался править - при запуске видит файлы, но на запуск диагностики/починки отвечал что не видит файла. Следующим инструментом стал mp3val и строчкой:
#find <folder> -name *mp3 -type f -exec mp3val -f '{}' \;
Были исправлены mp3 а старые заботливо переименованы в *.bak
Встала задча: все *bak из дерева <folder> перенести в дерево <folder.bak> С сохранением структуры.
Гугль решить эту задачу не помог. Из всего что нашел только вриант копирования с помощью команды cp с опцией --parents и удаление запуком потом rm вместо cp, но для 50Gb файлов на zfs это грустное зрелище.

Есть в linux инструментарий позволяющий переместить файлы по маске из дерева кталогов в новое дерево с сохранением структуры и прав/аттрибутов файлов/каталогов? Интересует именно перенос а не копирование/удаление. Зачем ворочать 50G файлов если можно просто сменить имя.

★★★

rsync -a --remove-source-files --exclude '*.mp3'

UPD: Хотя нет, он же будет копировать, а потом удалять. Ну можно набросать однострочник.

AnDoR ★★★★★
()
Последнее исправление: AnDoR (всего исправлений: 1)
cd folder
find . -type d -printf "mkdir -p ../folder.bak/%p\n" | $SHELL
find . -type f -name '*.bak' -printf "mv %p ../folder.bak/%p \n" | $SHELL
sdio ★★★★★
()

Если создание удаление не устраивает в виду времени выполнения, может попробовать через хардлинки? find bla bla bla exec <создание хардлинка; удаление оригинального> прокатит?

elijah_sd
()
Ответ на: комментарий от AnDoR

UPD: Хотя нет, он же будет копировать, а потом удалять

RTFM!

anonymous
()
$ cd folder
$ find -type f -iname '*.mp3.bak' -exec rmv.sh '{}' \;

rmv.sh:

#!/bin/bash
new_dir="../folder.bak/$(dirname "$1")"
mkdir -p "$new_dir"
mv "$1" "$new_dir"

anonymous
()
Ответ на: комментарий от AnDoR

rtfm аднака

rsync -a --remove-source-files --exclude '*.mp3'
UPD: Хотя нет, он же будет копировать, а потом удалять. Ну можно набросать однострочник.

Однако кроме mp3 в коллекции и еще что то будет, а надо вынести лишь *.bak

rtfm дал искомое: rsync -avm --del --include='*.bak' -f 'hide,! */' MyFolder/ MyFolder.bak

Оно может и копирует но rsync сохраняет атрибуты - что и требовалось

Спасибо всем кто предлагал другие решения, я остановился на самом простом и очевидном.

n0mad ★★★
() автор топика
Ответ на: комментарий от x905

Шутник!

перекачал давно бы уже

У кого перекачал?

50Gb это 12000 файлов. Нафига тратить время когда основная задача решается одной строкой? Это уже на бэкап потребовалось решить как это проще сделать. Здесь адекватные люди подсказали как это сделать, а не шутками начали кидаться. Решение оказалось тоже одной строкой.

P.S. Основная задача пофиксить ВСЁ что с косяками лишь для того чтобы rhythmbox не вставал в ступор на кривых файлах.

n0mad ★★★
() автор топика
Ответ на: Шутник! от n0mad

У кого перекачал?

у того кто раздает не битые mp3, ты ведь коллекцию собираешь - разве не лучше ее забрать у того, кто ее правильно подготовил, чем свою помойку разгребать

x905 ★★★★★
()
Ответ на: rtfm аднака от n0mad

Забыл про --remove-source-files

Правильная строка: rsync -avm --del --remove-source-files --include='*.bak' -f 'hide,! */' MyFolder/ MyFolder.bak

n0mad ★★★
() автор топика
Ответ на: комментарий от x905

У кого перекачал?

у того кто раздает не битые mp3, ты ведь коллекцию собираешь - разве не лучше ее забрать у того, кто ее правильно подготовил, чем свою помойку разгребать

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

В общем бессмысленно спортить что лучше а что хуже. Всё относительно, относительно точки зрения. Была задача и я просил способа ее решить. Ключ к решению здесь подсказали.
Хорошо что есть такие люди и огромное спасибо им за помощь.
В будущем многие смогут в гугле найти это обсуждение и почерпнуть из него решение. На сегодняшний день я не нашел. Похожие задачи были, но подсказки были очень громоздкими, поэтому и попросил помощи здесь.

n0mad ★★★
() автор топика
Ответ на: Забыл про --remove-source-files от n0mad

А теперь еще и забыл убрать --del

Правильная строка в итоге: rsync -avm --remove-source-files --include='*.bak' -f 'hide,! */' MyFolder/ MyFolder.bak

Иначе она при повторном выполнении снесет все .bak в пути назначения потому что их уже нет в источнике.

n0mad ★★★
() автор топика
Ответ на: комментарий от Deleted

Наличием потенциала вызывать желание задавать глупые вопросы, например.

Ну и кроме того, там больше вызовов шелла.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.