script unix pour répliquer la logique de code .net

Je n’ai aucune expérience du codage Unix en dehors de la navigation dans les répertoires et je me demandais si quelqu’un pouvait m’aider à écrire un script pour reproduire ce que je faisais au sein de .NET. On m’a dit qu’il fonctionnerait plus rapidement puisque le code .NET est déployé à distance et que l’utilisation d’un lecteur mappé pour accéder à de grandes quantités de dossiers est parfois lente. Je sortinge essentiellement les fichiers en déplaçant les fichiers des dossiers sélectionnés vers un groupe de dossiers en fonction du nom de fichier et en les sortingant chacun en fonction de la date du fichier incluse dans le nom de fichier.

Private Sub moveAllfiles(ByVal directoryStuff As Ssortingng) Dim templist As New ArrayList Dim finalDestination As Ssortingng = Ssortingng.Empty Dim pathName As Ssortingng = Ssortingng.Empty Dim fileToDelete As Ssortingng = Ssortingng.Empty Dim folderDate As Ssortingng = Ssortingng.Empty Dim counter As Integer = 0 Dim folders = Directory.EnumerateDirectories(directoryStuff) For Each item In folders Dim files As Ssortingng() = Directory.GetFiles(item) //' if directory is empty delete folder If Directory.GetFiles(item).Count = 0 Then Directory.Delete(item) Continue For End If For i As Integer = 0 To files.Count - 1 Try counter += 1 Dim oInfo As New FileInfo(files(i)) // ' if file is empty or small delete it If oInfo.Length <= 1 Then File.Delete(files(i)) Continue For End If If Not files(i).EndsWith(".gz") Then CompressFiles(files(i)) Continue For End If Dim objInfo As New FileInfo(files(i)) If Not objInfo.Name.Contains("Data_G_E") Then If objInfo.Name.Contains("Data_G_P") Then Dim pfiledate As String = objInfo.Name.Remove(20) pfiledate = pfiledate.Remove(7, 5) Dim ftempDirectory As String = "M:\Archive\DataP\" + pfiledate & "\" If Not Directory.Exists(ftempDirectory) Then Directory.CreateDirectory(ftempDirectory) Dim destdirectory As String = ftempDirectory Dim ff As String = files(i) fileToDelete = ff File.Move(ff, destdirectory + objInfo.Name) File.Delete(ff) Else Dim destdirectory As String = ftempDirectory Dim ff As String = files(i) fileToDelete = ff File.Move(ff, destdirectory + objInfo.Name) File.Delete(ff) End If End If Continue For End If Dim filedate As String = objInfo.Name.Remove(20) filedate = filedate.Remove(7, 5) Dim tempDirectory As String = String.Empty tempDirectory = "M:\Archive\DataE\" + filedate & "\" If Not Directory.Exists(tempDirectory) Then Directory.CreateDirectory(tempDirectory) Dim destdirectory As String = tempDirectory Dim ff As String = files(i) fileToDelete = ff File.Move(ff, destdirectory + objInfo.Name) File.Delete(ff) Else Dim destdirectory As String = tempDirectory Dim ff As String = files(i) fileToDelete = ff File.Move(ff, destdirectory + objInfo.Name) File.Delete(ff) End If Catch ex As Exception If ex.Message.Contains("already exists") Then File.Delete(fileToDelete) Console.WriteLine("DELETING OLD FILE " & fileToDelete) End If Continue For End Try Next Next End Sub 

Vous ne savez pas si la logique a du sens, mais fondamentalement, elle recherche tous les sous-dossiers. Enlève le nom du fichier pour obtenir la date et le nom qui indiquent où le fichier doit aller. Utilisez la date pour créer un dossier dans le répertoire de destination et déplacer les fichiers en conséquence. Si quelqu’un peut aider à démarrer ou proposer une meilleure façon de faire cela, je l’apprécierais vraiment.

Si vous ne regardez pas de trop près (voire pas du tout) votre code .NET, il semble que vous souhaitiez trouver tous les fichiers dans ou sous un répertoire donné, extraire une chaîne à partir d’une position fixe du nom de fichier à utiliser comme destination. répertoire, puis déplacez chaque fichier vers ce répertoire. Si c’est effectivement ce que vous essayez de faire, c’est assez simple. Pour déplacer chaque fichier dans ou sous le répertoire /p/a/t/h vers /path2/xxx où xxx est pris depuis les positions 7 à 10 dans le nom du fichier (j’ai sélectionné les index 7 et 10 de manière aléatoire), procédez comme suit:

 find /p/a/t/h -type f -exec sh -c 'd="/path2/${0:7:3}"; mkdir -p "$d"; mv -i "$0" "$d"' {} \; 

L’indicateur -i à mv provoquera une invite interactive si vous écrasez des fichiers, et est là pour vous aider à empêcher les imprudents de faire exploser les fichiers. (Mais vous, le lecteur, n’exécuteriez jamais de code que vous ne comprenez pas complètement, donc ce n’est pas nécessaire!) Vous pouvez le remplacer par -f ou le supprimer. Notez également que les guillemets ne sont nécessaires que si vos noms de fichiers sont pathologiques. (Par exemple, s’ils contiennent des espaces.)