Att jämföra filer i katalogträd

Jag råkade idag ut för att behöva jämföra filer i två stora katalogträd. Upprinnelsen till det var att jag har migrerat filer från Dropbox till Google Drive, men av någon orsak så fortsatte jag att redigera filerna i Dropbox… Det gjorde att jag snabbt behövde jämföra träden fil för fil, och det hade nog tagit hela sommaren om jag inte kunde utnyttja de behändiga verktygen diff och grep som finns i Unix-miljöer. Fortsätt läsa ”Att jämföra filer i katalogträd”

Sök och ersätt text med sed

Min första kontakt med kommandoradsverktyget sed (https://www.gnu.org/software/sed/) var när jag skulle ersätta vissa ord i en lång textfil på min server. sed är en stream editor som tydligen kan göra massor av smarta saker med textfiler, men än så länge har mitt behov enbart inskränkt sig till att söka efter och ersätta ord. Hur går man då tillväga?

Om man har en textfilen hello.txt med en eller flera förekomster av ordet ”Hej”, och man vill ersätta dessa förekomster med ”Goddag”, så gör man följande i sitt terminalfönster:

sed 's/hej/goddag/g' hello.txt > goddag.txt

där det inledande s:et står för ”substitute” och g:et står för ”global” (kan tydligen också utelämnas i det här sammanhanget). Nu kommer alla förekomster av ”hej” i filen hello.txt att bytas ut mot ”goddag”, och det nya innehållet skrivs till filen goddag.txt (innehållet i hello.txt är oförändrat). Om man inte önskar en ny fil, utan enbart vill ändra ursprungsfilen, så så används sed -ie och raden avslutas sedan efter ”hello.txt” (dock kan man inte ångra detta kommando efteråt om något skulle bli fel).

Om man av någon orsak skulle vilja byta ut ord oavsett skiftläge på respektive bokstav till ett ord med bokstäver med ett givet skiftläge lägger man till ett I i slutet:

sed 's/hej/Goddag/gI' hello.txt > goddag.txt

Då kommer alla skiftlägen av ”hej” (t ex ”HEJ” eller ”Hej”) att bytas ut mot ”Goddag”.

Man ska nog inte se detta kommando som ett substitut för att ändra ord i en text i en ordbehandlare, ärligt talat är det ju mycket lättare att söka och ersätta på olika sätt i t ex Word. Men har man t ex en databasfil med massor av webbadresser som ska ändras efter ett givet mönster på servern kan detta sätt vara en lösning.

Här finns (mycket) mer att läsa om sed.

Att ta bort filer baserat på en lista

Jag kom i en situation där jag av misstag hade massa filer som installerats utanför RPM-databasen på linuxsystemet. Dessa ville jag rensa bort från disken. Olyckligtvis låg dessa filer tillsammans med andra filer som jag ville behålla. Detta hanterade jag på följande vis.

För att få ut listan med filerna utanför rpm-databasen kördes:

comm -13 <(rpm -qla | sort) <(find /path/to/tree -type f | sort) < files.txt

Detta lade listan i filen files.txt , som används för att kunna radera dessa filer.

Att enbart radera filer från listan är inte så svårt. Det låter sig göras med

xargs -a files.txt

Problemet visade sig vara att detta inte raderar de tomma katalogerna som filerna kan lämna efter sig. Dessutom gillar jag inte att radera alla dessa filer i ett svep. Jo, det var ju det jag ville, men tänk om det är någon nödvändig fil som har slunkit med där… Det blir en eventuell jobbig felsökning efteråt i så fall.

Här kom paketeringsprogrammet tar till undsättning, detta inspirerat av denna tråd.

tar cvfz failed_files.tgz --remove-files -T files.txt

Nu fick jag alltså filerna paketerade i arkivet failed_files.tgz ,samtidigt som de raderades från platsen. På så sätt håller jag dem i ett sorts karantän, med sökväg bevarad i arkivet. Ett mycket smidigt sätt att hantera de 562 filerna som av misstag slunkit in i en befintlig katalog.