BASH 8
Bash-1 find Guest on 16th July 2020 03:04:33 AM
  1. Kleine Bash-Einführung: Dateien in Unterverzeichnissen löschen (in dem
  2. Fall die unsägliche "Thumbs.db".
  3.  
  4.  
  5.  
  6. Erstmal wichtig: Der Befehl "echo". Mach einfach mal:
  7.  
  8. $ echo "Sepp"
  9.  
  10. Echo gibt einfach einen String aus. Es geht aber z.B. auch:
  11.  
  12. $ echo SEPP *.jpg
  13.  
  14. oder
  15.  
  16. $ echo $PATH
  17.  
  18. oder
  19.  
  20. $ echo $HOSTNAME
  21.  
  22. Wobei hier auch die Autocompletion der Bash greift. Mach einfach mal:
  23.  
  24. $ echo $
  25.  
  26. Und drück 2x TAB. Oder:
  27.  
  28. $ echo $HOSTN
  29.  
  30. Und dann TAB - wenns eindeutig ist, wird bereits beim 1. TAB
  31. vervollständigt.
  32.  
  33. Praktisch, gell? :-)
  34.  
  35.  
  36. Jetzt zu deinem Thumbs.db-Problem:
  37.  
  38. Das geht mit dem Kommando find. Mach einfach mal:
  39.  
  40. $ find ./
  41.  
  42. Dann werden alle Dateien und Verzeichnisse angezeigt. Schöner ist die
  43. Ausgabe so:
  44.  
  45. $ find ./ -ls
  46.  
  47. Interessanter wirds hier:
  48.  
  49. $ find bla3/ -name 'Thumbs.db'
  50.  
  51. Wobei hier "bla3/" das zu durchsuchende Verzeichnis ist (das Aktuelle
  52. Verzeichnis ist "./").
  53.  
  54. "-name 'Thumbs.db'" ist ein Filter auf den Dateinamen. Es gibt auch
  55. "-iname 'filter'" - dann ists case insensitive. Du kannst z.B. auch so
  56. filtern:
  57.  
  58. $ find . -iname '*.jpg' -ls
  59.  
  60. Ein anderer praktischer Filter ist "-type f" (nur Dateien) oder "-type
  61. d" (nur Verzeichnisse). Es gibt noch diverse andere Filter. Schau
  62. einfach mal:
  63.  
  64. $ man find
  65.  
  66. Heiss wirds, wenn du mit den gefundenen Zeilen etwas machst. Das geht
  67. mit "-exec BEFEHL "{}" \;" - wobei "{}" durch den jeweiligen Datei bzw
  68. Verzeichnisnamen ersetzt wird. Das " \;" sagt, dass der Befehl hier aus
  69. ist.
  70.  
  71. Jetzt kannst du mal folgendes machen (noch ungefährlich):
  72.  
  73. $ find bla3/ -name 'Thumbs.db' -type f -exec echo rm "{}" \;
  74.  
  75. Was passiert hier?:
  76. - Verzeichnis "bla3/" wird durchsucht
  77. - es wird nach Name Thumbs.db gefiltert
  78. - UND nach dem Typ File (also keine Verzeichnisse mit Namen Thumbs.db)!
  79. - mit jeder gefundenen Datei wird der Befehl "echo rm DATEINAME"
  80.   ausgeführt.
  81.  
  82. Der Befehl "rm DATEINAME" löscht die Datei DATEINAME. Da du aber ein
  83. "echo" davorstehen hast, wird nichts gelöscht, sondern nur der Text "rm
  84. DATEINAME" ausgegeben.
  85.  
  86. Wichtig sind auch die Anführungszeichen um {}. Das ist wichtig bei
  87. solchen autoatisierten Sachen, wenn du Dateinamen/Pfade mit Leerzeichen
  88. hast. Sonst kann es im ungünstigen Fall passieren, dass du versehentlich
  89. Dateien löschst. Stell dir vor, du hast eine Datei namens "Datei 1 2 3",
  90. und außerdem die Dateien "1", "2" und "3". Wenn du jetzt ein
  91.  
  92. $ rm Datei 1 2 3
  93.  
  94. machst, werden 4 Dateien gelöscht, obwohl du nur eine Datei löschen
  95. wolltest! Daher musst du sowas in Anführungszeichen setzen:
  96.  
  97. $ rm "Datei 1 2 3"
  98.  
  99. Aber zurück zum Problem. Hier nochmal der harmlose Befehl von oben, und
  100. im Vergleich dazu der "scharfe" Befehl:
  101.  
  102. $ find bla3/ -name 'Thumbs.db' -type f -exec echo rm "{}" \;
  103. $ find bla3/ -name 'Thumbs.db' -type f -exec rm "{}" \;
  104.  
  105. Alles klar?
  106.  
  107. Und noch ein PROTIP: Bei so automatisierten Löschereien vorm Durchgang
  108. IMMER eine entschärfte Version (wie das mit dem "echo rm") testen - so
  109. Dateifilter sind teilweise bissl tricky. So Filter greifen teilweise
  110. bei Sachen, an die man zunächst nicht denkt. So findet z.B. ein
  111.  
  112. $ ls .*
  113.  
  114. nicht nur die versteckten Dateien ".irgendwas" im aktuellen Verzeichnis,
  115. sondern halt auch das aktuelle und das hierarchisch übergeordnete
  116. Verzeichnis, weil "." und ".." auch gematcht werden, und "." für das
  117. aktuelle Verzeichnis steht, und ".." für das Übergeordnete.

Paste is for source code and general debugging text.

Login or Register to edit, delete and keep track of your pastes and more.

Raw Paste

Login or Register to edit or fork this paste. It's free.