Вопрос: Как перемещать файлы в соответствующие папки с одинаковым именем?


Пример сценария:

У меня есть несколько файлов, заканчивающихся .torrent и я хотел бы переместить их в папки с таким же именем.

Например, учитывая следующие файлы:

abc.torrent
def.torrent
some files has spaces.torrent
or [special] (characters).torrent
or . (dots).torrent
xyz.torrent

Я хотел бы переместить их в соответствующие папки (если существует), которые имеют точно такое же имя, например:

  • abc.torrent переходит в abc/
  • def.torrent переходит в def/
  • и так далее

Если папка не существует, файл должен оставаться нетронутым (так как это может относиться к неполной загрузке).

Я считаю, что у BitTorrent таких опций нет. Если это так, я бы хотел найти некоторую командную строку для этого.

При желании я хотел бы указать исходную папку для моих файлов и папку назначения с ожидаемыми каталогами.

Есть идеи?


2
2017-12-21 23:06


Источник


@terdon Если каталог не существует, игнорируйте файл и перемещайтесь, поскольку файлы могут быть связаны с неполными загрузками. - kenorb
Хорошо, я дал оба варианта. - terdon


Ответы:


  • Нерекурсивно:

    for t in *torrent; do [ -d "${t%.*}" ] && mv "$t" "${t%.*}"; done 
    

    ${var%pattern} синтаксис удаляет кратчайшее совпадение pattern от конца переменной. В этом случае он просто удаляет расширение.

  • Рекурсивно (используя bash):

    shopt -s globstar
    for t in **/*torrent; do [ -d "${t%.*}" ] && mv "$t" "${t%.*}"; done
    

    globstar вариант делает ** соответствуют любым файлам и 0 или более каталогам. Обратите внимание, что вышеизложенное ожидает, что целевой каталог будет подкаталогом родительского каталога torrent-файла. Итак, если файл находится на foo/bar/baz.torrent, он будет перемещен в foo/bar/baz/baz.torrent,

  • Не рекурсивно, создавая каталог, если он отсутствует:

    for t in *torrent; do mkdir -p "${t%.*}"; mv "$t" "${t%.*}"; done 
    

    -p опция указывает mkdir чтобы не печатать ошибки, если каталог уже существует, и при необходимости создавать родительские каталоги. Так, mkdir -p foo/bar/baz также создаст foo а также bar если они не существуют.

  • Рекурсивно, создавая каталог, если он отсутствует:

    shopt -s globstar
    for t in **/*torrent; do mkdir -p "${t%.*}"; mv "$t" "${t%.*}"; done
    

3
2017-12-21 23:42



Для части «создание каталога, если отсутствует», я думаю, вы можете использовать $_ в mv команду как mkdir похоже, обновляет его независимо от того, существует ли каталог или нет. - h.j.k.
**/*torrent версии генерирует пути, поэтому -d проверьте их снова (не называйте это самим), вот версия, которая использует базовые имена и переходите в /foo папка: for t in **/*torrent; do [ -d /foo/"$(basename "${t%.*}")" ] && mv -v "$t" /foo/"$(basename "${t%.*}")/"; done - kenorb


Поскольку я не мог найти такой вариант в OS X версии BitTorrent, я написал следующий однострочный:

find . -name "*.torrent" -exec sh -c 'DST=$(find . -type d -name "$(basename "{}" .torrent)" -print -quit); [ -d "$DST" ] && mv -v "{}" "$DST/"' ';'

Это будет искать .torrent файлов в текущем каталоге (.) и найдите папки (DST) с тем же именем, рекурсивно найденным в той же папке (.). Чтобы проверить разные каталоги, измените точки (.) в соответствующие пункты назначения. См. Полный сценарий: mv_torrents.sh,


3
2017-12-21 23:06