1 votes

Commande terminal pour déplacer tous les fichiers éparpillés dans un répertoire avec le nom du fichier

J'ai un dossier contenant des milliers de fichiers et répertoires. Je voudrais déplacer tous les fichiers qui ne sont pas contenus dans un sous-répertoire dans un répertoire et les nommer du nom du fichier, tout en laissant les fichiers déjà présents à l'intérieur des répertoires, c'est-à-dire :

  • créer 'newdir'
  • déplacer 123.mp4 vers 'newdir'
  • changer le nom de 'newdir' en '123'
  • répéter

1voto

David Anderson Points 30783

Commande

Cette commande a été testée dans un shell bash.

for x in *;do if [[ -f $x ]];then mkdir newdir;mv "$x" newdir/.;mv newdir "${x%.*}";fi;done

Explication

Le code ci-dessous n'est pas une série de commandes à exécuter. Il s'agit plutôt d'une explication des différentes parties du code montré ci-dessus.

Boucler à travers tous les noms de fichiers dans le répertoire actuel.

for x in *;do ... done

Ne traiter que les fichiers réguliers. (Ignorer les répertoires.)

if [[ -f $x ]];then ... fi;

Créer un nouveau répertoire newdir.

mkdir "newdir";

Déplacer le fichier x dans le nouveau répertoire newdir.

mv "$x" newdir/.;

Renommer newdir avec le nom du nouveau répertoire souhaité. (Définir newdir sur le nom du fichier x après avoir supprimé le dernier . et tous les caractères qui suivent.)

mv newdir "${x%.*}";

Commentaires

Si le répertoire souhaité existe déjà, alors le dossier newdir (contenant le fichier) sera déplacé vers le répertoire souhaité. Par exemple, si le fichier 123.mp4 et le répertoire 123 existent déjà, alors le fichier 123.mp4 finira dans 123/newdir. Vous pouvez vérifier si cela s'est produit en entrant la commande ci-dessous.

find . -name newdir

Par exemple, si 123/newdir/123.mp4 existait, alors la sortie suivante apparaitrait.

./123/newdir

0voto

awy Points 500

Limitations:

  • Ne fonctionne pas si vous avez un fichier sans extension. 1

  • La gestion des exceptions doit être ajoutée en cas d'existence d'un répertoire.

  • Fonctionnait sur Mojave. Python 3.7.3, mais les publications ci-dessous ne mentionnent souvent pas leurs versions non plus.

  • N'a pas été publié sur Code Review.

  • #%% sont pour l'extension Jupyter de VSCode.

    %%

    import os

    %%

    source = "/Users/me/Desktop/folder" # attention à la barre oblique finale manquante filenames = next(os.walk(source))[2] filenames = [ x for x in filenames if not ".DS_Store" in x]

    %%

    dirpaths = [os.path.splitext(file)[0] for file in filenames]

    %%

    def making(directory,source=source): directory = os.path.join(source,directory+"/") os.makedirs(directory)

    a = [making(directory) for directory in dirpaths] # la compréhension de liste pourrait être plus rapide que les boucles.

    %%

    def movingfiles(onefile, source=source): os.rename(source + "/" + onefile, source + "/" + os.path.splitext(onefile)[0] + "/" + onefile )

    b = [movingfiles(onefile) for onefile in filenames] # encore une liste inutile.

Sources dans l'ordre du besoin:

0voto

nohillside Points 82672

Si vous souhaitez utiliser find pour éviter les problèmes typiques liés aux noms de fichiers contenant des espaces et d'autres caractères d'espacement :

find . -maxdepth 1 -type f ! -name '.DS_Store' -exec bash -c '
    t="${1:2}";
    mkdir FluffyBird;
    mv "$t" FluffyBird/
    mv FluffyBird "${t%.*}"' _ {} \;

Remplacez FluffyBird par n'importe quelle chaîne qui n'est pas déjà un nom de fichier dans le dossier.

LesApples.com

LesApples est une communauté de Apple où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres utilisateurs d'appareils Apple, poser vos propres questions ou résoudre celles des autres.

Powered by:

X