3 votes

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

Exemple de scénario :

J'ai plusieurs fichiers qui se terminent 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

Je voudrais les déplacer dans les dossiers correspondants (s'ils existent) qui ont exactement le même nom, par exemple :

  • abc.torrent va dans abc/
  • def.torrent va dans def/
  • et ainsi de suite

Si le dossier n'existe pas, le fichier ne doit pas être modifié (car il peut être lié à un téléchargement incomplet).

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

En option, je voudrais spécifier le dossier source de mes fichiers, et le dossier de destination avec les répertoires attendus.

Des idées ?

0 votes

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

0 votes

Oh bien, j'ai donné les deux options.

3voto

kenorb Points 22006

Comme je n'ai pas trouvé cette option dans la version OS X de BitTorrent, j'ai écrit la ligne unique suivante :

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

Cela permettra de rechercher le .torrent dans le répertoire actuel ( . ) et trouver les dossiers ( DST ) avec le même nom trouvés récursivement dans le même dossier ( . ). Pour vérifier les différents répertoires, changez les points ( . ) vers des destinations appropriées. Voir le script complet : mv_torrents.sh .

3voto

Mohsin Points 11
  • De manière non récurrente :

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

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

  • De manière récursive (en utilisant bash ) :

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

    El globstar L'option fait ** correspond à tous les fichiers et à 0 ou plusieurs répertoires. Notez que le système ci-dessus s'attend à ce que le répertoire cible soit un sous-répertoire du répertoire parent du fichier torrent. Ainsi, si un fichier se trouve à foo/bar/baz.torrent il sera déplacé vers foo/bar/baz/baz.torrent .

  • De manière non récursive, en créant le répertoire s'il est absent :

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

    El -p L'option indique mkdir pour n'afficher aucune erreur si le répertoire existe déjà et pour créer des répertoires parents si nécessaire. Ainsi, mkdir -p foo/bar/baz créera également le foo y bar s'ils n'existent pas.

  • De manière récursive, en créant le répertoire s'il est absent :

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

0 votes

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

0 votes

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

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X