Die ersten 20 Zeilen von .txt Datein automatisch löschen lassen?

kid2407  11.10.2023, 15:53

Welches Betriebssystem?

derendgegner911 
Fragesteller
 11.10.2023, 16:02

Habe Windows 10 aktuell

2 Antworten

Mit den gängigen Unix-Tools ist das eine Kleinigkeit. Für eine einzelne Datei:

sed -i '' '1,20d' datei.txt

Für alle *.txt-Files in allen Ordnern unter dem aktuellen:

find . -type f -name "*.txt" -exec sed -i '' '1,20d' "{}" \;

Das sollte man aber sorgfältig testen (sed ohne i-Flag!). Oder zumindest die Daten vorher sichern.

Irgendwie geht das sicher auch mit Powershell, falls du auf Windows bist. Aber da ist die Syntax sogar noch verkorkster.

derendgegner911 
Fragesteller
 11.10.2023, 15:54

Was ist denn ein gängiges Unix Tool ,habe nur Windows

0
jo135  11.10.2023, 15:57
@derendgegner911

Das sind Kommandos, die auf Linux, MacOS und ähnlichen Betriebssystemen direkt verfügbar sind. Auf Windows geht das dann wohl am einfachsten mit WSL2. Und wie gesagt, man kann sicher irgendwie dasselbe mit Powershell hinkriegen, aber da steig ich persönlich aus.

0
Get-ChildItem -Path '.' -Filter '*.txt' -Recurse -ea sil|
 %{
   $NewText = Get-Content $_.FullName|
    Select-Object -Skip 20
   $NewText|
    Set-Content $_.FullName
 }

parallel bei deine Massen von Dateien:

function Get-PartSizes ( [Long]$Size , [Long]$Parts ) {
    $Quotient=[Math]::Floor($Size/$parts)
    $Remainder=$Size%$parts
    $(for ($i=0;$i -lt $parts; ++$i){
        if ($Remainder){
            $Quotient+1
            --$Remainder
        }
        else{$Quotient}
    })|? {$_}
}


 #was die Jobs  tun sollen (das  gleiche  wie   im oberen  Script)
$Job_Worker = {
    param(
        [Array]$FileList=@()
    )
    $FileList |
        %{ 
            "verarbeite Datei $_" #nur mal ein Lebenszeichen des Jobs aus  dem Hintergrund
            $NewText = Get-Content $_ |
                Select-Object -Skip 20
            $NewText|
                Set-Content $_
        }
}


 #Anzahl der paralelen  Jobs festlegen  (Hier Automatisch) 
$JobCount=$env:NUMBER_OF_PROCESSORS


  #Liste  aller .txt -Dateien
[Array]$SearchFiles =(Get-ChildItem -Path 'C:\basepath' -Filter *.txt -Recurse -ea Silent).FullName


 #Dateiliste in einigermaßen gleich große Teile zerlegen
$ListSlices=Get-PartSizes $SearchFiles.Count $JobCount |
    ?{$_}|
    %{$base=0}{
        ,$SearchFiles[$base..($base+$_-1)]  #aufpassen, Comma-Operator ...als neues Array übergeben
        $base+=$_
    }


  #Jobs  starten
$Jobs = $ListSlices|
    %{ Start-Job  -ScriptBlock $Job_Worker  -ArgumentList (,$_) }
 #auf vollzug  warten
$Jobs| Receive-Job -wait
Woher ich das weiß:eigene Erfahrung – Ich mach das seit 30 Jahren