Вопрос Перемещение всех файлов определенного типа или расширения


У меня есть большой внешний со многими вложенными папками, что я хочу переместить все видео, картинки и музыку на другой жесткий диск, что было бы лучшим способом сделать это?


2
2017-08-08 19:58


происхождения


stackoverflow.com/questions/18338322/... - dan08
Это похоже на то, что я пытаюсь сделать, только я хотел бы, чтобы он переместил все найденные файлы в другой каталог. Извините, я очень новичок в командной строке, и я не уверен, как изменить это, чтобы сделать это сам. - Daniel


ответы:


Я бы попробовал что-то вроде ..

for files in $(find / | grep -P "([.]mp3$)|([.]avi$)")
do
cp $files /media/<your_external_drive>/target_folder/
done

Вы должны добавить каждое расширение, которое хотите найти в регулярном выражении, если хотите сделать все за один снимок.

Если вы просто хотите переместить каталоги, вы можете использовать,

cp -r /target/dir/on/machine /target/dir/on/external/drive

для каждого каталога, содержащего ваши медиафайлы.


1
2017-08-08 20:04



Это выглядит отлично, теперь, как я могу указать в поиске, чтобы сказать, где искать? - Daniel
Вы хотите сказать find /path/to/your/target/directory, где путь к вашему целевому каталогу - это что-то вроде / home / username / Music, или / home / username / Video. экземпляр выше, где я использовал find /, указывает, что find должен проходить через всю доступную файловую систему, что почти всегда не нужно, но результат довольно. - blanket_cat
Правильно ли эти скобки и цитаты? - Tim
Они теперь, хороший улов. - blanket_cat


Я на самом деле не конечно вы хотите переместить много файлов из многих каталогов, но вот основная команда для поиска файлов нескольких расширений в одной структуре каталогов:

find /path/to/look/ -type f \( -iname \*.mp3 -o -iname \*.avi -o -iname \*.mp4 \)

Вы, очевидно, захотите -o -iname ... до тех пор, пока вы не уверены, что найдете все нужные файлы. Когда у вас есть все, просто добавьте это в конец:

-exec mv -t /path/to/destination {} +

И это переместит их все в указанный каталог.


Bashier способ сделать это будет использовать несколько модификаторов глобулизации (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

1
2017-08-10 00:00





Я очень рекомендую программу FreeFileSync, Это отлично подходит для не только синхронизации двух каталогов, но и для задачи, которую вы имеете в виду. Вы можете добавлять фильтры для включения или исключения шаблонов. Сначала вы просто просматриваете начало координат слева и пункт назначения справа. Затем нажмите «Сравнить», чтобы выполнить поиск по всем вашим файлам. Наконец, нажмите красную воронку вверху, чтобы отредактировать фильтры.

Для фильтров вы помещаете каждый шаблон в новую строку. Вы можете заменить * в разделе include с чем-то вроде следующего и оставить раздел исключений нетронутым. Следующие будут перемещать только файлы mp3, avi и jpg:

*.mp3
*.avi
*.jpg

Или, если вы оставите * в разделе include вы можете сказать, какие файлы вы не хотите перемещать. Следующие добавленные в исключение разделы будут перемещать все, кроме файлов txt, odt и pdf:

*.txt
*.odt
*.pdf

После внесения изменений и закрытия диалогового окна фильтра файлы, которые не будут перемещены, будут недоступны. Кнопки внизу рядом с «Выбрать вид:» позволяют вам изменять, какие файлы отображаются (эти кнопки не влияют на то, какие файлы будут перемещаться). Отображая только файлы «ничего не делать», только выбрав только серая полоска, найдите любые, которые вы хотите переместить, которые не должны быть, и соответствующим образом измените фильтры. Аналогичным образом, отображая только файлы, которые нужно перенести, имея только выбранную зеленую стрелку, найдите любые, которые будут перемещены, но вы не хотите быть соответствующим образом модифицированы.


0
2017-08-08 20:13





Вы можете использовать простой скрипт 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.

0
2017-08-10 06:56