У меня есть большое внешнее со многими подпапками, что я хочу переместить все видео, изображения и музыку к другому жесткому диску, каков был бы лучший способ сделать это?
Я не действительно уверен , Вы хотите переместить много файлов из многих каталогов, но вот основная команда для нахождения файлов нескольких расширений в одной структуре каталогов:
find /path/to/look/ -type f \( -iname \*.mp3 -o -iname \*.avi -o -iname \*.mp4 \)
Вы, очевидно, захотите прикрепить больше -o -iname ...
на это, пока Вы не будете уверены, что находите все файлы, которые Вы хотите. Когда у Вас будет все, просто добавьте это до конца:
-exec mv -t /path/to/destination {} +
И это переместит их всех в указанный каталог.
<час> А Bashier способ сделать это использовал бы несколько globbing модификаторов ( globstar
к рекурсивному поиску с **
, nullglob
, чтобы только возвратить правильные файлы и nocaseglob
для игнорирования регистра) и затем просто выдал бы их к mv
в простом for
цикл:
shopt -s globstar nullglob nocaseglob
for f in /path/to/look/{**/,}*.{mp3,avi,mp4}; do
mv "$f" /path/to/destination/
done
Я попробовал бы что-то как..
for files in $(find / | grep -P "([.]mp3$)|([.]avi$)")
do
cp $files /media/<your_external_drive>/target_folder/
done
необходимо добавить каждое расширение, которое Вы хотите искать в regex, если Вы хотите сделать все это в одном выстреле.
Или если Вы просто хотите переместить каталоги, Вы могли бы использовать,
cp -r /target/dir/on/machine /target/dir/on/external/drive
для каждого каталога, содержащего Ваши медиа-файлы.
Я настоятельно рекомендую программу FreeFileSync . Это является большим для того, чтобы не только синхронизировать два каталога, но также и для задачи Вы имеете в виду. Можно добавить фильтры, чтобы включать или исключить шаблоны. Сначала Вы просто просматриваете к источнику слева и месту назначения справа. Тогда щелчок выдерживает сравнение для поиска всех файлов. Наконец нажмите на красную трубу наверху для редактирования фильтров.
Для фильтров, Вы помещаете каждый шаблон в новую строку. Можно заменить *
в, включает раздел с чем-то как следующее, и отпуск исключает нетронутый раздел. Следующее переместится только mp3, avi, и jpg файлы:
*.mp3
*.avi
*.jpg
Или, если Вы уезжаете *
в, включает раздел, можно сказать, какие файлы Вы не хотите перемещать. Следующее, добавленное к, исключает раздел, переместит все кроме txt, odt, и файлов PDF:
*.txt
*.odt
*.pdf
, Как только Вы вносите свои изменения и закрываете диалоговое окно фильтра, файлы, которые не будут перемещенными, отобразятся серым. Кнопки в нижней части рядом с "Избранным Представлением": позвольте Вам изменять, какие файлы отображены (эти кнопки не влияют на то, какие файлы будут перемещенными). Отображение только "Ничего не делает" файлы при наличии только серой выбранной панели, ищет любого, который Вы хотите быть перемещенными, которые не будут и изменяют фильтры соответственно. Аналогично, отображая только файлы, которые будут перемещены при наличии только зеленой выбранной стрелки, ищите любого, который был бы перемещен, но Вы не хотите быть и изменять фильтры соответственно.
Вы могли использовать простой сценарий Python, чтобы сделать задание:
#!/usr/bin/env python3
import os
import shutil
source_dir = "/path/to/files"; target_folder = "/path/to/destination"; extensions = (".mp3", ".avi")
for root, dirs, files in os.walk(source_dir):
for name in files:
if name.endswith(extensions):
file = root+"/"+name
shutil.move(file, target_folder+"/"+name)
Вставка код выше в пустом текстовом файле, введите цель - и исходные каталоги, введите расширения файла, Вы хотите переместить, сохранить его как move.py
и выполнить его командой:
python3 /path/to/move.py
, Чтобы постараться не перезаписать возможные дубликаты (и переименовывать их)
, Если существует риск, что каталог содержит дубликаты (имена), которые Вы хотите сохранить, код немного более обширен:
#!/usr/bin/env python3
import os
import shutil
source_dir = "/path/to/files"; target_folder = "/path/to/destination"; extensions = (".mp3", ".avi")
dup = 1
for root, dirs, files in os.walk(source_dir):
for name in files:
if name.endswith(extensions):
file = root+"/"+name
while os.path.exists(target_folder+"/"+name):
name = name[:name.rfind(".")]+"_"+str(dup)+name[name.rfind("."):]
dup = dup+1
shutil.move(file, target_folder+"/"+name)
В этом случае, несколько случаев file.mp3
будут переименованы к:
file.mp3
file_1.mp3
file_2.mp3
...etc.