Dateien scheffeln mit cpio 0

Posted by fwoeck
on Friday, April 24

Weil ich das jedes Mal wieder nachschlagen muss, schreib ich’s grad auf:

Wichtige Flags:

  1. v – verbose
  2. d – erzeugt Verzeichnisse beim Restore
  3. u – überschreibt bestehende Dateien
  4. a – liest die Timestamps beim Backup
  5. m – schreibt die Timestamps beim Restore
  6. p – copy-pass-Modus

Standardbenutzung

Ein Archiv erzeugen:

cd /quellverz
find . -depth -mtime -8 -print | cpio -ova > backup.cpio

und restaurieren:

cd /zielverz
cpio -ivdm < backup.cpio

(ACLs bleiben erhalten)

Copy-pass-Modus

Mit dem Copy-pass-Modus (p) lassen sich Files on-the-fly kopieren, ohne ein Archiv zu erzeugen. Z.B. hier, kopiere alle Dateien, deren Veränderungen jünger sind, als die der Datei ~/a_file.tm:

cd /quellverz
find . -depth -newer ~/a_file.tmp -print | cpio -pvduam /zielverz

Gotcha: AR "find" und "find_by_id" 0

Posted by fwoeck
on Wednesday, November 19

Der kleine Unterschied zwischen ActiveRecords find und find_by_id kann manchmal ein großer sein: find wirft eine Exception, falls die Ergebnismenge leer ist:

>> Project.unarchived.find(40)
ActiveRecord::RecordNotFound: Couldn't find Project with ID=40
...

>> Project.unarchived.find_by_id(40)
=> nil

Textstellen in versionierten Projekten mit "sed" ersetzen 0

Posted by fwoeck
on Monday, September 29

Wenn man auf der Kommandozeile sed benutzt, um in allen Dateien auf einmal Textstellen zu ersetzen, muss man die .svn-Pfade ausschließen, weil man sonst die lokale Arbeitskopie aus Sicht der Revisionierung unbrauchbar macht. Ein Workaround mit find und xargs lautet so:

find ./ -type f -name '*rb' | grep -v svn | grep -v vendor | grep -v lib |
                    xargs -iHIER sed -i 's/New \([a-zA-Z]+\)/\1 anlegen/g' HIER

Es besteht aber u.U. die Gefahr, Textstellen an unerwünschten Orten zu ersetzen. Am besten, man wählt die Quellordner einzeln aus:

find ./app -type f | grep -v svn |
                    xargs -iHIER sed -i 's/New \([a-zA-Z]+\)/\1 anlegen/g' HIER

Nachtrag: Es ist zu prüfen, ob dies auch auf git-Repos zutrifft.