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”
Etikett: smarttools
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.
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.