Créer des dossiers avec le nom des fichiers existants

Bonjour à toutes et à tous !

Je recherche à créer des dossiers pour-y mettre des fichiers, le problème c’est le nombre de fichiers à gérer, le faire manuellement demanderai pas mal de temps, aussi j’aurai voulu savoir si il était possible de le faire à l’aide d’un logiciel ou d’une commande pour le faire en lot…

Pour le moment j’ai des fichiers nommés comme cela :
Mon curé chez les nudistes.avi

J’aurai voulu créer un dossier avec le même nom et-y mettre le fichier .avi à l’intérieur :
Mon Curé chez les nudistes\Mon curé chez les nudistes.avi

Ensuite j’ajouterai manuellement pour chacun d’eux des infos qui me permettrons de faire des recherches plus facilement avec le programme “rechercher des fichiers”

Dossier :
Mon curé chez les nudistes - 1976 - Français - Paul Presbois, Michel Galabru

Fichier inclus dans ce dossier :
Mon curé chez les nudistes.avi

Au final si je fait une recherche avec le programme “rechercher des fichiers” (par année, acteur, etc) je devrait avoir ça :

...\Mon curé chez les nudistes - 1976 - Français - Paul Presbois, Michel Galabru\Mon curé chez les nudistes.avi

J’ai essayé pas mal de gestionnaire de films mais aucun ne m’a satisfait, je cherche donc à faire cela moi-même au niveau des dossiers.

Salut :wink:

Bonjour

fichsAvi=( *.avi ); for fich in "${fichsAvi[@]}"; do mkdir "${fich%.*}" && mv "$fich" "${fich%.*}"; done

Bonjour et merci pour l’intérêt :wink:

Quand j’ai envoyé la commande, cela m’a créé un fichier * à la racine du disque, que j’ai retrouvé en affichant les dossiers cachés. Mais cela ne correspond pas à ce que j’attendais ; il faudrait que je créer un dossier avec le même nom que le fichier en .Avi, mais cela en lot (pour chacun des fichiers .Avi existants sur mon DDE)Capture

Mais tu ne nous a pas dit où sont situés tes fichiers .avi,
ni depuis quel répertoire et avec quel compte utilisateur tu as lancé la commande.

J’ai donc supposé que tu lancerais la ligne de commande que je te proposais
depuis le répertoire dans lequel seraient présents les fichiers à déplacer
et dans lequel seront créés les répertoires nommés,
et avec le compte utilisateur auquel ces fichiers appartiennent
en espérant que tu aies les privilèges nécessaires pour créer ces répertoires.

Je suppose donc que tu avais malheureusement lancé cette ligne de commande depuis la racine du système de fichiers avec les privilèges du compte root.
La ligne de commande que je t’ai proposé, si elle a effectivement été lancée avec les privilèges du compte root et depuis la racine de ton système de fichiers a certainement dû créer un répertoire nommé * plutôt qu’un fichier.
Et un message d’erreur a dû s’afficher puisqu’il n’existait aucun fichier nommé *.avi à déplacer :

mv: impossible d'évaluer '*.avi': Aucun fichier ou dossier de ce type

Si tu veux une ligne de commande plus spécifique au contexte dans lequel tu voudrais la lancer, il faudra un peu plus d’informations concernant ce contexte.

Le retour d’un
ls -l /chemin/absolu/du/répertoire/contenant/les/fichiers/avi/*.avi
listant ces fichiers .avi et les attributs les concernant me permettra sans doute de pouvoir te proposer une ligne de commande plus adaptée au contexte dans lequel tu voudrais la lancer.
Cela me permettra aussi de savoir quels privilèges ou compte utilisateur il faudra utiliser pour lancer cette ligne de commande.

Si ces fichiers .avi sont dans plusieurs répertoires ou/et qu’ils appartiennent à différents comptes utilisateurs
il faudra utiliser une toute autre méthode.

En effet j’ai lancé cette commande depuis le bureau et j’ai eu l’erreur que tu as écrit :

Voici le retour de la commande (un extrait, la liste est trop longue…) :

 -rw------- 1 wx wx   843758194 août   5  2013 /media/wx/4455B6E44083FC48/Shaft - Les Nuits Rouges de Harlem.avi

Les fichiers pour lesquels je voudrais créer des dossiers se trouvent sur le même disque dur externe

Ok, je comprends beaucoup mieux : les fichiers .avi sont dans un système de fichiers
dont la racine utilise le point de montage /media/wx/4455B6E44083FC48

En utilisant le compte utilisateur qui pourra accéder à ces fichiers (je suppose qu’il s’agit du compte wx),
entre consécutivement les deux lignes de commandes suivantes :

fichsAvi=($(find /media/wx/4455B6E44083FC48 -name *.avi 2>/dev/null))
for fich in "${fichsAvi[@]}"; do mkdir "${fich%.*}" && mv "$fich" "${fich%.*}"; done
1 J'aime

Ce qui paraît être une bonne idée, ne l’est pas forcement.
Mieux vaut écrire un fichier texte portant le nom du fichier AVI dans le répertoire en question, et lors du parcours des répertoires, consultez celui-ci.

Pourquoi ? La longueur du nombre de caractères autorisés par ton FS… dans les noms de répertoires.

Alors que segmenter l’information dans un fichier texte, sera plus aisé, tel que :

Titre:
Année:
Langue:
Auteurs:

sera très simple à manipuler quelque soit le langage utilisé :wink:
(et ne t’alourdira pas le poids en octets…)

1 J'aime

Merci à vous deux pour l’aide et avis :wink:

@MicP : Je vais faire un premier essai sur une plus petite collection en premier lieu, histoire de voir le résultat, pense-tu que ces commandes peuvent fonctionner avec cet autre volume, la différence c’est le répertoire en plus “films” dans ce volume :
/media/wx/F8D3-AE96/films

Ce qui devrait donner les commandes suivantes :

@PengouinPdt:
Oui tu as raison, il-y-a un risque de ce côté, mais je n’ai rien constaté avec mon système (Point Linux “Jessie” - Mate - 32bits) ainsi qu’avec Windows 10 (pas encore testé sous Ubuntu, XP, Seven) donc cela me convient, mais j’y avais pensé, ce qui m’a fait changé d’avis c’est quand je suis allé voir un pote sous W$ 10 qui avait ce système de classement et j’ai été bluffé par la facilité avec laquelle il “sortait” des films avec différents critères, juste avec une recherche (sans passer par un logiciel tiers)
Ceci dit, je vais couper la poire en deux et mettre uniquement le genre du film après le titre, les autres infos (pays, acteurs, année, etc) je les incluraient dans des fichiers textes ultérieurement.

Salut

Bonjour

Aucun problème, ça fonctionnera.

Je précise aussi que la ligne de commande find que je t’avais proposé
prenait en compte tous les fichiers dont le nom d’extension est “.avi”
dans le chemin spécifié et dans tous les sous-répertoires de ce chemin.
Ce qui correspondait à ce que tu avais demandé :


Si tu veux ne traiter que les fichiers d’un répertoire donné
sans prendre en compte les fichiers contenus dans ses sous-répertoires,

il faudrait ajouter à la ligne de commande find l’option -maxdepth 1

Donc, pour ne prendre en compte que les fichiers .avi du répertoire /media/wx/F8D3-AE96/films
sans prendre en compte les fichiers qui seraient contenus
dans les sous-répertoires de /media/wx/F8D3-AE96/films

fichsAvi=($(find /media/wx/F8D3-AE96/films -maxdepth 1 -name *.avi 2> /dev/null))
for fich in "${fichsAvi[@]}"; do mkdir "${fich%.}" && mv "$fich" "${fich%.*}"; done
2 J'aime

Bonjour,

Lorsque je copie/colle la commande que tu m’as donné, j’ai le message d’erreur suivant :

Citation

fichsAvi=($(find /media/wx/F8D3-AE96/films -name *.avi 2>/dev/null)) 
for fich in "${fichsAvi[@]}"; do mkdir "${fich%.*}" && mv "$fich" "${fich%.*}"; done

Citation
erreur de syntaxe près du symbole inattendu « ;& »

Bonjour

Le système que tu utilises pour faire un copié/collé
ou/et le navigateur web que tu utilises
ou/et l’application dans laquelle tu colles la ligne de commandes
interprètent certains caractères.

Dans la ligne de commande que je t’ai proposée,
la suite des deux caractères && a été interprétée par ton copié/collé
ce qui fait qu’elle a été transformée, une fois collée, en une suite de caractères &&

Donc, une fois collée dans la fenêtre du terminal,
pour corriger cette interprétation parasite,
il te faut remplacer dans la ligne de commandes collée
la suite de caractères :
&&

par :
&&