web-dev-qa-db-fra.com

Itérer tous les fichiers d'un répertoire en utilisant une boucle 'pour'

Comment puis-je parcourir chaque fichier d'un répertoire à l'aide d'une boucle for?

Et comment pourrais-je savoir si une certaine entrée est un répertoire ou s'il ne s'agit que d'un fichier?

289
Vhaerun

Ceci liste tous les fichiers (et seulement les fichiers) dans le répertoire actuel:

for /r %i in (*) do echo %i

De plus, si vous exécutez cette commande dans un fichier de commandes, vous devez doubler les signes%. 

for /r %%i in (*) do echo %%i

(merci @agnul) 

417
jop

Itérer à travers ...

  • ... fichiers dans le répertoire en cours: for %f in (.\*) do @echo %f
  • ... sous-répertoires dans le répertoire en cours: for /D %s in (.\*) do @echo %s
  • ... fichiers dans le sous-répertoire actuel et tous les sous-répertoires: for /R %f in (.\*) do @echo %f
  • ... sous-répertoires actuels et tous les sous-répertoires: for /R /D %s in (.\*) do @echo %s

Malheureusement, je n'ai trouvé aucun moyen de parcourir les fichiers et les sous-répertoires en même temps.

Utilisez simplement cygwin avec son bash pour beaucoup plus de fonctionnalités.

À part cela: avez-vous remarqué que l'aide à la construction de MS Windows est une excellente ressource pour la description de la syntaxe de ligne de commande de cmd?

Regardez aussi ici: http://technet.Microsoft.com/en-us/library/bb490890.aspx

193
Marco

Il existe une différence subtile entre exécuter FOR à partir de la ligne de commande et à partir d'un fichier de commandes. Dans un fichier de commandes, vous devez insérer deux caractères % devant chaque référence de variable.

A partir d'une ligne de commande:

FOR %i IN (*) DO ECHO %i

A partir d'un fichier batch:

FOR %%i IN (*) DO ECHO %%i
55
aphoria

Cette boucle for listera tous les fichiers d'un répertoire.

pushd somedir
for /f "delims=" %%f in ('dir /b /a-d-h-s') do echo %%f
popd

"delims =" est utile pour afficher les noms de fichiers longs avec des espaces ....

'/ b "affiche uniquement les noms, pas les dates de taille, etc.

Quelques choses à savoir sur dir/un argument.

  • Toute utilisation de "/ a" listerait tout, y compris les attributs cachés et système.
  • "/ ad" n'affichera que les sous-répertoires, y compris ceux cachés et ceux du système.
  • L'argument "/ a-d" élimine le contenu avec l'attribut 'D'irectory.
  • "/ a-d-h-s" affichera tout, sauf les entrées avec l'attribut 'D'irectory,' H'idden '.

Si vous utilisez ceci sur la ligne de commande, supprimez un "%".

J'espère que cela t'aides.

40
Jay

En bash, vous pourriez faire quelque chose comme ça:

for fn in *; do
    if [ -d $fn ]; then
        echo "$fn is a directory"
    fi
    if [ -f $fn ]; then
        echo "$fn is a file"
    fi
done

Je viens de remarquer que vous avez demandé à propos de batch , ce que j'ai mal interprété comme bash . Cette réponse peut donc ne pas être appropriée à votre question.

11
Greg Hewgill

% 1 fait référence au premier argument passé et ne peut pas être utilisé dans un itérateur.

Essaye ça: 

@echo off
for %%i in (*.*) do echo %%i
10
Sam Meldrum
for %1 in (*.*) do echo %1

Essayez "HELP FOR" dans cmd pour un guide complet

Ceci est le guide pour les commandes XP. http://www.ss64.com/nt/

5
Axeman

Le code suivant crée un fichier nommé"AllFilesInCurrentDirectorylist.txt"dans le répertoire actuel, qui contient la liste de tous les fichiers (uniquement les fichiers) du répertoire actuel. Vérifiez-le

dir /b /a-d > AllFilesInCurrentDirectorylist.txt
3
Ankur

J'utiliserais vbscript (Windows Scripting Host), car je suis sûr que, par lots, vous ne pouvez pas dire qu'un nom est un fichier ou un répertoire.

Dans vbs, ça peut être quelque chose comme ça:

Dim fileSystemObject
Set fileSystemObject = CreateObject("Scripting.FileSystemObject")

Dim mainFolder
Set mainFolder = fileSystemObject.GetFolder(myFolder)

Dim files
Set files = mainFolder.Files

For Each file in files
...
Next

Dim subFolders
Set subFolders = mainFolder.SubFolders

For Each folder in subFolders
...
Next

Vérifiez FileSystemObject sur MSDN .

2
Biri

J'utilise la commande xcopy avec l'option/L pour obtenir les noms de fichier. Donc, si vous voulez obtenir soit un répertoire, soit tous les fichiers du sous-répertoire, vous pouvez faire quelque chose comme ceci:

for /f "delims=" %%a IN ('xcopy "D:\*.pdf" c:\ /l') do echo %%a

Je viens d'utiliser le c:\comme destination, car il existe toujours sur les systèmes Windows et ne copie pas, donc cela n'a pas d'importance. si vous voulez aussi les sous-répertoires, utilisez simplement l'option/s à la fin. Vous pouvez également utiliser les autres commutateurs de xcopy si vous en avez besoin pour d'autres raisons. 

2
Knoots

J'ai eu du mal à obtenir la réponse de jop pour travailler avec un chemin absolu avant d'avoir trouvé cette référence: https://ss64.com/nt/for_r.html

L'exemple suivant parcourt tous les fichiers d'un répertoire donné par le chemin absolu.

For /R C:\absoulte\path\ %%G IN (*.*) do (
  Echo %%G
)
2
datchung

essaye ça:

::Example directory
set SetupDir=C:\Users

::Loop in the folder with "/r" to search in recursive folders, %%f being a loop ::variable 
for /r "%SetupDir%" %%f in (*.msi *.exe) do set /a counter+=1

echo there are %counter% files in your folder

il compte les fichiers .msi et .exe dans votre répertoire (et dans le sous-répertoire). Cela fait donc aussi la différence entre les dossiers et les fichiers en tant qu'exécutables.

Ajoutez simplement une extension (.pptx .docx ..) si vous avez besoin de filtrer d'autres fichiers de la boucle.

2
Littlepony

Il pourrait aussi utiliser le forfiles command:

forfiles /s 

et aussi vérifier si c'est un répertoire 

forfiles /p c:\ /s /m *.* /c "cmd /c if @isdir==true echo @file is a directory"
2
Max

Essayez ceci pour tester si un fichier est un répertoire:

FOR /F "delims=" %I IN ('DIR /B /AD "filename" 2^>^&1 ^>NUL') DO IF "%I" == "File Not Found" ECHO Not a directory

Cela vous indiquera seulement si un fichier n'est PAS un répertoire, ce qui sera également vrai si le fichier n'existe pas, alors assurez-vous de vérifier d'abord si cela est nécessaire. Les carets (^) sont utilisés pour échapper aux symboles de redirection et la sortie de liste de fichiers est redirigée vers NUL pour empêcher son affichage, tandis que la sortie d'erreur de la liste DIR est redirigée vers la sortie afin que vous puissiez tester le message de DIR "Fichier introuvable. ".

2
sugerfunk

Dans mon cas, je devais supprimer tous les fichiers et dossiers sous un dossier temporaire. C'est comme ça que j'ai fini par le faire. Je devais exécuter deux boucles, une pour le fichier et une pour les dossiers. Si les fichiers ou les dossiers ont des espaces dans leurs noms, vous devez utiliser ""

cd %USERPROFILE%\AppData\Local\Temp\
rem files only
for /r %%a in (*) do (
echo deleting file "%%a" ...
if exist "%%a" del /s /q "%%a"
)
rem folders only
for /D %%a in (*) do (
echo deleting folder "%%a" ...
if exist "%%a" rmdir /s /q "%%a"
)
0
Sam B

Pour parcourir tous les fichiers et dossiers vous pouvez utiliser

for /F "delims=" %%a in ('dir /b /s') do echo %%a

Pour parcourir tous les dossiers uniquement pas avec des fichiers, vous pouvez alors utiliser

for /F "delims=" %%a in ('dir /a:d /b /s') do echo %%a

/s donnera tous les résultats dans l’arborescence de répertoires avec une profondeur illimitée. Vous pouvez ignorer /s si vous souhaitez parcourir le contenu de ce dossier et non leur sous-dossier.

Implémentation de la recherche en itération

Pour parcourir un fichier nommé particulier et des dossiers vous pouvez rechercher le nom et effectuer une itération à l'aide de la boucle for

for /F "delims=" %%a in ('dir "file or folder name" /b /s') do echo %%a

Pour parcourir des dossiers/répertoires nommés particuliers et non des fichiers , utilisez ensuite /AD dans la même commande

for /F "delims=" %%a in ('dir "folder name" /b /AD /s') do echo %%a
0
jafarbtech