Die ersten 20 Zeilen von .txt Datein automatisch löschen lassen?
Hallo ich habe einen Ordner mit 1000en Unterordnern und überall befinden sich txt Dateien drinnen wo immer die ersten 20 Zeilen Text gelöscht werden sollen bei allen ... das mit der Hand zu machen ist unmöglich oder dauert Wochen ...
Welches Betriebssystem?
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.
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.
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
Was ist denn ein gängiges Unix Tool ,habe nur Windows