Мне было любопытно, смогу ли я найти решение, которое достигает двух целей:
Основываясь на прекрасном ответе @kusalananda на другие вопросы и ответы U&L под названием:Понимание опции -exec для find
, я думаю, что придумал что-то, что решит вашу проблему.
Для начала вот моя примерная структура каталогов, которая имитирует вашу.
$ mkdir -p Artist{1..5}/Album{1..5}
$ touch Artist{1..5}/Album{1..5}/Track{1..5}.mp3
Это приводит к следующему:
$ find Artist* -type f | head
Artist1/Album1/Track1.mp3
Artist1/Album1/Track2.mp3
Artist1/Album1/Track3.mp3
Artist1/Album1/Track4.mp3
Artist1/Album1/Track5.mp3
Artist1/Album2/Track1.mp3
Artist1/Album2/Track2.mp3
Artist1/Album2/Track3.mp3
Artist1/Album2/Track4.mp3
Artist1/Album2/Track5.mp3
Теперь, чтобы скопировать файлы mp3 в./targetDir
:
$ find. -type f -name '*.mp3' -exec sh -c \
'cp {} targetDir/$(echo "{}" | sed "s#\./##g;s#/#-#g")' \;
Что приводит к этому:
$ ls targetDir/ | head
Artist1-Album1-Track1.mp3
Artist1-Album1-Track2.mp3
Artist1-Album1-Track3.mp3
Artist1-Album1-Track4.mp3
Artist1-Album1-Track5.mp3
Artist1-Album2-Track1.mp3
Artist1-Album2-Track2.mp3
Artist1-Album2-Track3.mp3
Artist1-Album2-Track4.mp3
Artist1-Album2-Track5.mp3
Мне нравится этот подход, потому что я могу сначала обернуть команду cp...
в echo
, чтобы я мог проверить вывод, прежде чем приступить к выполнению работы:
$ find. -type f -name '*.mp3' -exec sh -c \
'echo "cp {} targetDir/$(echo "{}" | sed "s#\./##g;s#/#-#g")"' \;
cp./Artist1/Album1/Track1.mp3 targetDir/Artist1-Album1-Track1.mp3
cp./Artist1/Album1/Track2.mp3 targetDir/Artist1-Album1-Track2.mp3
cp./Artist1/Album1/Track3.mp3 targetDir/Artist1-Album1-Track3.mp3
cp./Artist1/Album1/Track4.mp3 targetDir/Artist1-Album1-Track4.mp3
cp./Artist1/Album1/Track5.mp3 targetDir/Artist1-Album1-Track5.mp3
cp./Artist1/Album2/Track1.mp3 targetDir/Artist1-Album2-Track1.mp3
cp./Artist1/Album2/Track2.mp3 targetDir/Artist1-Album2-Track2.mp3
cp./Artist1/Album2/Track3.mp3 targetDir/Artist1-Album2-Track3.mp3
cp./Artist1/Album2/Track4.mp3 targetDir/Artist1-Album2-Track4.mp3
...
Это решение берет вывод find
, а затем запускает следующую команду оболочки:
cp {} targetDir/$(echo "{}" | sed "s#\./##g;s#/#-#g")'
Это будет cp
файл от Artist../Album../Track..
до targetDir/..
и переформулирует имя так, чтобы оно имело тире(-
)везде, где есть косая черта(/
).
ПРИМЕЧАНИЕ:Я добавил 2 операции в sed
.Первый удаляет любой префикс ./
, который может существовать, если вы используете find....
вместо find Artist*..
.
Я думаю, что делать это с помощью find
и cp
все же не идеальное решение. Я тоже поддерживаю каталоги файлов MP3, и я думаю, что делать что-то подобное с rsync
и с помощью предоставленных вами списков rsync
может быть более полезной реализацией, в долгосрочной перспективе, поскольку вы можете использовать ее для обновления, а не для повторного -копировать каждый раз, когда вы запускаете его.
$ man rsync
...
--files-from=FILE read list of source-file names from FILE
Просто мысль.
I need to bridge my ethernet and wifi adapters together.
Это часто задаваемые вопросы. :Wi-Fi по умолчанию использует так называемый режим 3 -адресов -, и следствием этого является то, что вы не можете соединить клиент Wifi и Ethernet .
(Ну, технически можно, но это не сработает. :Пакеты из сети Wi-Fi не дойдут до пунктов назначения в Ethernet, даже если они соединены мостом и находятся в одной подсети. Если вы пишете «вроде как работает», вы, вероятно, не проверяли этот случай ).
Однако вы можете соединить точку доступа Wi-Fi(AP )и Ethernet.
Итак, это XY вопрос:Ваш Y: "Мне нужно соединить Wi-Fi и локальную сеть на Debian Buster", но мы не знаем, какой у вас X (возможно :У меня есть Wi-Fi и локальная сеть дома, и я хотел бы, чтобы они были в одной подсети? ).
И в зависимости от того, какой у вас X, есть и другие способы добиться этого, например, вы можете соединить точку доступа Wi-Fi и локальную сеть в своем маршрутизаторе .