У меня есть вся своя музыка в папке /media/kalenpw/MyBook/Music/ABunchOfOtherFoldersWithFilesInside
. Я хочу скопировать все mp3s к /media/kalenpw/HDD/Music
таким образом, я использовал:
cp -R /media/kalenpw/MyBook/Music/*.mp3 /media/kalenpw/HDD/Music
однако это только скопировало mp3s в корневой музыкальной папке и не открыло ни одного из подкаталогов художника и скопировало те файлы.
У меня создалось впечатление -R
рекурсивно скопировал бы все файлы. Как я могу достигнуть, сказала цель?
Использование:
find /media/kalenpw/MyBook/Music/ -name '*.mp3' -exec cp {} /media/kalenpw/HDD/Music \;
<час> причина Вашей команды, не работающей, состоит в том, который называет содержащий подстановочные знаки (*.mp3
), расширены, прежде чем команда выполняется, поэтому если у Вас было три файла (01.mp3
, 02.mp3
, 03.mp3
), Ваша эффективная команда была:
cp -R /media/kalenpw/MyBook/Music/01.mp3 /media/kalenpw/MyBook/Music/02.mp3 /media/kalenpw/MyBook/Music/03.mp3 /media/kalenpw/HDD/Music
, Как Вы видите -R
, не имеет никакого эффекта в этом случае.
Вы конкретно упомянули файлы (файлы) / каталог (каталоги), который будет скопирован как использование *.mp3
т.е. любой файл/имя каталога, заканчивающийся в .mp3
.
Так любой файл, заканчивающийся в .mp3
в /media/kalenpw/MyBook/Music/
каталог и точно так же любой каталог, заканчивающийся в .mp3
в /media/kalenpw/MyBook/Music/
будет скопирован, рекурсивно. Если не будет такого подобранного файла/каталога, то ничто не будет скопировано.
Теперь скопировать все .mp3
файлы от /media/kalenpw/MyBook/Music/
рекурсивно к каталогу /media/kalenpw/HDD/Music/
:
Используя bash
:
shopt -s globstar
cp -at /media/kalenpw/HDD/Music /media/kalenpw/MyBook/Music/**/*.mp3
Используя find
:
find /media/kalenpw/MyBook/Music -type f -name '*.mp3' -exec cp -at /media/kalenpw/HDD/Music {} +
Можно также использовать CPR:
$ cd /media/kalenpw/HDD/Music
$ cpr -p '/\.mp3$/' '/media/kalenpw/MyBook/Music/'
Отметьте это без -p
CPR сохранит пути полного списка на скопированных именах файлов.
-r
может использоваться (вместо -p
) сохранить путь под '/media.../музыка / '.
Также cpr
будет заботиться, что никакой файл не перезаписывается, добавляя число, запускающееся в '0001' к любому повторному скопированному имени файла.
Предположим, что у Вас есть набор .docx
, .mp3
, .txt
и .xlsx
файлы сохранили в этой структуре каталогов:
/files/
/files/dir1/
/files/dir1/dir11/
/files/dir1/dir12/
/files/dir1/dir13/
/files/dir2/
/files/dir3/
/files/dir3/dir31/
/files/dir3/dir32/
/files/dir4/
/files/dir5/
/files/dir51/
/files/dir52/
/files/dir53/
/files/dir54/
... и Вы хотите рекурсивно вызвать во все такие каталоги для копирования всех найденных .mp3
файлы к /home/me/music/
но Вы не хотите сохранять такое дерево каталогов в месте назначения (т.е. Вы хотите все найденные .mp3
файлы, которые будут скопированы в /home/me/music/
вместо скопированного в соответствующие каталоги такой как /home/me/music/dir1/
, /home/me/music/dir1/dir11/
и так далее).
В таком случае, на терминале оболочки (удар) первый показ эта команда для доступа к корню поиска файла:
cd /files
... и затем выполненный эта команда:
for i in `find . -iname '*.mp3'`; do cp $i /home/me/music/; done
В случае, если Вы действительно хотите сохранить дерево каталогов источника в месте назначения, выполнить эту команду вместо этого (после того, как выполнение cd /files
):
find . -iname '*.mp3' | cpio -pdm /home/me/music/
На вышеупомянутых командах поиск нечувствителен к регистру (т.е. соответствия .mp3
, .MP3
, .mP3
и .Mp3
). Использовать -name
вместо -iname
если Вы хотите, чтобы поиск был чувствителен к регистру (например, использование -name
для .mp3
строка символов будет соответствовать файлам, заканчивающимся .mp3
но не те, которые заканчиваются .MP3
, .mP3
ни .Mp3
).