У меня есть несколько тысяч файлов в одном каталоге, которые я хотел бы сортировать в таких каталогах:
Из этого:
└── Files
├── AAA.mkv
├── AAA.nfo
├── AAA-picture.jpg
├── BBB.mp4
├── BBB.srt
├── BBB-clip.mp4
├── CCC.avi
├── CCC.srt
├── CCC-clip.mov
└── CCC.nfo
К этому:
[ f2]Имена файлов различаются по длине и количеству слов, иногда разделенных пробелами и, возможно, несколькими с дефисами (в дополнение к завершающим «-short». Это в первую очередь видеофайлы с различными форматами / контейнерами : mov / mpg / mkv / mp4 / avi / ogg. Некоторые из них имеют субтитры. Некоторые из них имеют файлы со связанными метаданными (.nfo или -clip)
Редактирование: основными файлами являются видео (здесь я бы например, рисовать имя каталога). Связанные файлы представляют собой метаданные. Некоторые разные имена в именах только с расширением. Есть полдюжины других вариантов базового имени файла, такого как -clip.mp4 -clip.mov или -picture.jpg I если бы что-то предлагалось с этими немногими, то я мог (надеюсь) работать над выяснением остальных. Таким образом, AAA.mkv переходит в каталог с именем AAA. Затем все файлы метаданных, начинающиеся с AAA, присоединяются к нему (т.е. , в этом примере: AAA-picture.jpg и AAA.nfo). Таким образом, базовое имя на самом деле является подстрокой в случае файла AAA-picture.jpg. Я бы сказал, что, вероятно, относительно безопасно просто использовать дефис в качестве разделительного фактора ... хотя «-clip» или «-picture» в целом будет более безопасным.
Как я могу это сделать без получение синдрома кистевого туннеля? Я посмотрел на это, но он был достаточно другим, что мои слабые способности к скриптингу испугались.
Спасибо.
Я сделал небольшой скрипт bash для этого, упрощенного и улучшенного благодаря комментариям OP, @dannysauer, @Arronical и @Scott
#!/bin/bash
for file in *
do mkdir -p "${file%%[.-]*}" 2>/dev/null
if [[ -d "${file%%[.-]*}" ]]; then
if [[ -f "$file" ]]; then
echo mv -v -- "$file" "${file%%[.-]*}"
fi
fi
done
Сначала запустите с echo, а затем удалите [ f4] для фактического перемещения файлов. Сценарий должен запускаться из каталога, в который вы хотите переместить файлы. Если вы предпочитаете, здесь это как однострочная команда:
for file in *; do mkdir -p "${file%%[.-]*}"; if [[ -d "${file%%[.-]*}" ]]; then if [[ -f "$file" ]]; then echo mv -v -- "$file" "${file%%[.-]*}"; fi ; fi ; done
(снова удалите echo после тестирования)
На маленьком скрипте python:
#!/usr/bin/env python3
import shutil
import os
import sys
dr = sys.argv[1]
for f in os.listdir(dr):
split = f.rfind("."); short = f.find("-")
if split != -1:
extension = f[split:]
newname = f[:short] if short != -1 else f[:split]
target = os.path.join(dr, newname)
if not os.path.exists(target):
os.mkdir(target)
shutil.move(os.path.join(dr, f), os.path.join(target, f))
Чтобы использовать его:
скопируйте его в пустой файл. Сохраните его как move_into.py Запустите его с каталогом в качестве аргумента:python3 /path/to/move_into.py /path/to/directory
Сценарий предполагает, что все (соответствующие) файлы имеют расширения. Если файл не имеет расширения, с ним ничего не происходит.
Затем файл перемещается в соответствующую папку.