Comment déplacer des fichiers dans les dossiers correspondants qui portent le même nom?


2

Exemple de scénario:

J'ai plusieurs fichiers se terminant par .torrent et je voudrais les déplacer dans des dossiers qui ont le même nom.

Par exemple, étant donné les fichiers suivants:

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

J'aimerais les déplacer dans les dossiers correspondants (le cas échéant) qui portent exactement le même nom, par exemple:

  • abc.torrent entre dans abc/
  • def.torrent entre dans def/
  • etc

Si le dossier n'existe pas, le fichier doit rester intact (car il peut s'agir d'un téléchargement incomplet).

Je crois que BitTorrent n'a pas de telles options. Si tel est le cas, j'aimerais trouver une ligne de commande pour y parvenir.

Je souhaite éventuellement spécifier le dossier source de mes fichiers et le dossier de destination avec les répertoires attendus.

Des idées?


@terdon Si le répertoire n'existe pas, ignorez le fichier et poursuivez, car les fichiers pourraient être liés à des téléchargements incomplets.
kenorb

Eh bien, j'ai donné les deux options.
terdon

Réponses:


3
  • Non récursivement:

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

    le ${var%pattern} la syntaxe supprime la correspondance la plus courte pattern à partir de la fin d'une variable. Dans ce cas, il supprime simplement l'extension.

  • Récursivement (en utilisant bash ):

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

    le globstar option fait ** correspond à tous les fichiers et 0 ou plusieurs répertoires. Notez que ce qui précède s'attend à ce que le répertoire cible soit un sous-répertoire du répertoire parent du fichier torrent. Donc, si un fichier est à foo/bar/baz.torrent, il sera déplacé vers foo/bar/baz/baz.torrent.

  • Non récursivement, création du répertoire en cas d'absence:

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

    le -p l'option dit mkdir pour ne pas imprimer d'erreur si le répertoire existe déjà et pour créer des répertoires parents au besoin. Alors, mkdir -p foo/bar/baz créera également le foo et bar répertoires s'ils n'existent pas.

  • Récursivement, création du répertoire en cas d'absence:

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

Pour la partie 'création du répertoire en cas d'absence', je pense que vous pouvez utiliser $_ dans le mv commande en tant que mkdir semble le mettre à jour, que le répertoire existe ou non.
h.j.k.

**/*torrent version génère des chemins, donc -d vérifier contre eux (pas nommer lui-même), voici la version qui en utilisant les noms de base et se déplacent dans /foo dossier: for t in **/*torrent; do [ -d /foo/"$(basename "${t%.*}")" ] && mv -v "$t" /foo/"$(basename "${t%.*}")/"; done
kenorb

3

Comme je ne pouvais pas trouver une telle option sur la version OS X de BitTorrent, j'ai écrit le one-liner suivant:

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

Cela cherchera le .torrent fichiers dans le répertoire en cours ( . ) et trouver les dossiers ( DST ) avec le même nom trouvé récursivement dans le même dossier ( . ). Pour rechercher des répertoires différents, modifiez les points ( . ) vers des destinations appropriées. Voir le script complet: mv_torrents.sh.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.