Umgang mit Dateien/Ordnern mit Leerzeichen im Bash-Skript

Umgang mit Dateien/Ordnern mit Leerzeichen im Bash-Skript

Ich muss auf einem System nach places.sqlite suchen, dessen Ordnername möglicherweise Leerzeichen enthält. Dies funktioniert ohne Leerzeichen im Ordnernamen:

    for each in `find /home/ -name "places.sqlite" | grep -i ".mozilla/firefox"` ;do
         echo "${each}"
    done

Es wird Folgendes ausgegeben: /home/itsupport/.mozilla/firefox/d2gigsya.default/places.sqlite (zum Beispiel)

Wenn der Ordner jedoch Leerzeichen enthält, wird der Pfad zur Datei zerstückelt und mein Skript wird unterbrochen!

Um es noch einmal zusammenzufassen: Dieser Ordnertyp WÜRDE im Skript funktionieren:

    $ sudo find /home/ -name "places.sqlite" | grep -i ".mozilla/firefox"
    /home/itsupport/.mozilla/firefox/d2gigsya.default/places.sqlite

Und dieser Ordner mit Leerzeichen funktioniert im Skript NICHT:

    $ sudo find /home/ -name "places.sqlite" | grep -i ".mozilla/firefox"
    /home/itsupport/.mozilla/firefox/Random Ass Location/places.sqlite

Ich weiß, dass Sie $(command) oder etwas Ähnliches verwenden können, aber ich bin mir nicht sicher, was ich tun soll, wenn ich find als Schleifenvariable verwende. Vielleicht ist das hier mein Fehler. Wie auch immer, jede Hilfe wäre großartig.

Antwort1

findhat die -print0Flagge, um dieses Problem zu beheben:

#!/bin/bash

find . -print0 | while read -d $'\0' file
do
    echo ${file}
done

Beispiel:

$ ls
script.sh  space name
$ ./script.sh 
.
./script.sh
./space name

Antwort2

Eine andere Möglichkeit besteht darin, IFS zum Teilen am Zeilenende anstelle von Leerzeichen zu verwenden.

oldIFS="$IFS"
IFS=$'\n'
for bla in ....
do
...
done
IFS="$oldIFS" # restoring to avoid surprising the rest of the script

Antwort3

Da sich die Dateien an bekannten Orten befinden, können Sie einfach

for each in /home/*/.mozilla/firefox/*/places.sqlite
do echo "${each}"
done

verwandte Informationen