web-dev-qa-db-fra.com

Comment extraire une liste complète de types d'extension dans un répertoire?

Dans un répertoire et de manière récursive dans ses sous-répertoires, ce qui signifie que chaque répertoire d'un répertoire est traité, comment compiler une liste complète des extensions uniques dans le répertoire?

Le système d'exploitation est Windows XP avec toutes les mises à jour actuelles, mais je peux exécuter le script si je suis capable de dire ce qu'il fait, bien que je préfère ne pas avoir à installer dot-net, car je ne le fais vraiment pas. J'aime ça.

26
blunders

Ce script batch le fera.

@echo off

set target=%~1
if "%target%"=="" set target=%cd%

setlocal EnableDelayedExpansion

set LF=^


rem Previous two lines deliberately left blank for LF to work.

for /f "tokens=*" %%i in ('dir /b /s /a:-d "%target%"') do (
    set ext=%%~xi
    if "!ext!"=="" set ext=FileWithNoExtension
    echo !extlist! | find "!ext!:" > nul
    if not !ERRORLEVEL! == 0 set extlist=!extlist!!ext!:
)

echo %extlist::=!LF!%

endlocal

Enregistrez-le sous le nom de fichier .bat et exécutez-le à l'aide de la commande batchfile(remplacez le nom que vous l'avez nommé) pour répertorier le répertoire en cours ou spécifiez un chemin avec batchfile "path". Il cherchera dans tous les sous-répertoires.

Si vous souhaitez exporter dans un fichier, utilisez batchfile >filename.txt (ou batchfile "path" >filename.txt).

Explication

Tout ce qui précède la ligne for /f... définit simplement les choses: le répertoire cible est recherché, active expansion retardée , ce qui me permet de mettre à jour les variables dans la boucle et définit une nouvelle ligne (LFname __) = que je peux utiliser pour une sortie plus nette. Oh, et le %~1 signifie "récupère le premier argument, en supprimant les guillemets", ce qui évite les doubles guillemets - voir for /?.

La boucle utilise cette commande dir /b /s /a:-d "%target%", en récupérant une liste de tous les fichiers de tous les sous-répertoires de la cible.

%%~xi extrait l'extension des chemins complets renvoyés par la commande dirname__.

Une extension vide est remplacée par "FileWithNoExtension", vous savez donc qu'il existe un tel fichier. Si j'ajoutais une ligne vide à la place, ce n'est pas aussi évident.

Toute la liste en cours, si elle est envoyée via une commande findname__, pour garantir l'unicité. La sortie texte de la commande find est envoyée à nulname__, essentiellement un trou noir - nous ne le voulons pas. Etant donné que nous ajoutons toujours un : à la fin de la liste, nous devons également nous assurer que la requête de recherche se termine par un : afin qu'il ne corresponde pas aux résultats partiels - voir les commentaires.

% ERRORLEVEL% est défini par la commande findname__; la valeur 0 indique qu'il y a une correspondance. Donc, si ce n'est pas 0, l'extension actuelle n'est pas sur la liste jusqu'à présent et devrait être ajoutée.

La ligne echo est en sortie, et je remplace également mes caractères réservés (:) par des nouvelles lignes pour lui donner une apparence agréable.

28
Bob

Bien que ne répondant pas strictement aux exigences d'un script batch, j'ai utilisé un script powershell à une seule ligne:

Get-Childitem C:\MyDirectory -Recurse | WHERE { -NOT $_.PSIsContainer } | Group Extension -NoElement | Sort Count -Desc > FileExtensions.txt

Vous pouvez éventuellement l'exécuter à partir du fichier de ligne de commande/batch:

Powershell -Command "& Get-Childitem C:\MyDirectory -Recurse | WHERE { -NOT $_.PSIsContainer } | Group Extension -NoElement | Sort Count -Desc > FileExtensions.txt"

Je ne revendique aucun crédit pour cela, et bien sûr, vous aurez besoin de l’installation de Powershell. Pour les versions plus récentes de Windows, il n’ya pas de solution.

Si vous supprimez C:\MyDirectory, il sera exécuté dans le répertoire en cours.

À la fin, il produira un fichier FileExtensions.txt contenant les éléments suivants:

+-------+------+
| Count | Name |
+-------+------+
| ----- | ---- |
| 8216  | .xml |
| 4854  | .png |
| 4378  | .dll |
| 3565  | .htm |
| ...   | ...  |
+-------+------+

Selon la structure de votre dossier, des erreurs peuvent parfois vous avertir que le chemin d'accès est long.

Get-ChildItem : The specified path, file name, or both are too long. The fully qualified file name must be less than 260 characters, and the directory name must be less than 248 characters.

Les sous-répertoires de celui-ci ne seront pas non plus analysés, mais les résultats pour tout le reste s'afficheront.

16
Dan Atkinson

Voici une réponse détaillée en utilisant PowerShell (avec Windows XP, vous devrez installer PowerShell):

Hé, le scripteur! Comment utiliser Windows PowerShell pour choisir les extensions de fichier uniques utilisées dans une collection de fichiers?

4
RichardM

J'ai trouvé utile de changer

if "!ext!"=="" set ext=FileWithNoExtension

à

if "!ext!"=="" set ext=.FileWithNoExtension

et de changer

echo %extlist::=!LF!%

à

echo %extlist::=!LF!% > ext-list.txt

Le fichier généré contient (pas de sauts de ligne, mais peu importe) .bat.pdf.skp.ai.png.jpg.tif.pcp.txt.lst.ttf.dfont.psd.indd.docx.PDF.JPG.gif.jpeg .dwg.exr.FileWithNoExtension.vrlmap.sat.bak.ctb

que j'ai ensuite pu utiliser pour mon projet.

0
Steev43230

Pour lister toutes les extensions uniques de cmd sous le chemin que vous utilisez:

Powershell -Command "Get-ChildItem . -Include *.* -Recurse | Select-Object Extension | Sort-Object -Property Extension -Unique"
0
kofifus