web-dev-qa-db-fra.com

Comment traitrer les fichiers dans des dossiers, selon les noms de fichier - Windows CMD

Comment trier les fichiers dans des dossiers, en fonction des noms de fichiers, à l'aide des commandes CMD/PowerShell?

Disons que j'ai un dossier contenant une grande quantité de fichiers (plus de 20 000 fichiers), où tous les fichiers ont la même convention de dénomination, par exemple: (remarquez le motif)

t_1001_1801.png
t_1001_1802.png
t_1001_1803.png
...
t_1001_2112.png (last file starts with 't_1001_')
t_1002_1801.png
t_1002_1802.png
t_1002_1803.png
....
t_1002_2112.png
t_1003_1801.png
t_1003_1802.png
t_1003_1803.png
...
t_1214_2112.png (last file in folder)

J'exécute cette commande cmd pour créer une liste de dossiers:
for /l %i in (1001,1,1214) do md x%i
[.____] qui crée une liste de dossiers, E.g:

x1001
x1002
x1003
...
x1214

Maintenant, je voudrais trier (déplacer) les fichiers dans les dossiers en fonction du nom des fichiers, E.g:

- move the files t_1001_1801.png to t_1001_2112.png to the folder x1001.
- move the files t_1002_1801.png to t_1002_2112.png to the folder x1002.
...

Puis-je utiliser des commandes shell à cet effet?

5
Gil Epshtain

Vous devez simplement diviser le nom de fichier, obtenir le numéro (comme 1001), comparer le numéro aux dossiers, obtenir le dossier correct et déplacer les fichiers de là:

# Folder where Files and Folders are located
$TopFolder = "C:\Install"

# Getting Folders and Files
$Folders = gci $TopFolder -OutVariable Files | ? { $_.PSisContainer }

# Loop over all Files with *.png extension
$Files | ? { $_.Extension -eq '.png' } | % {

    # Split FileName to get the number (like 1001)
    $num = ($_.Name -split "_")[1]

    # Get FolderName by reading out foldername (without 'x') and compare it to number
    $MoveTo = $Folders | ? { $_.Name.substring(1,($_.Name.length -1)) -eq $num }

    # If a folder was found, move file there. else print error
    if ($MoveTo)
    {
        Move-Item $_.FullName $MoveTo -Force
        Write-Host "Copied File $($_.Name) to $MoveTo"
    }
    else 
    { 
        Write-Host "Did not find folder x$($num) in $TopFolder" 
    }
}
8
SimonS

Crédit à @Neil, pour sa réponse (dans les commentaires), je veux juste la poster comme une réponse pour les autres.

for /l %i in (1001,1,1024) do md x%i&move t_%i_* x%i

Explication:
[.____] - la boucle sur% i de 1001 à 1024 (1 est l'étape d'itération)
[.____] - Pour chaque itération faire:
1. Répertoire Nommé X% I (X1001, X1002, ...).
[.____] 2. Déplacez le fichier correspondant à l'expression régulière T_% I_ * (T_1001_1801) dans le répertoire X% I (qui était simplement créé).

0
Gil Epshtain