
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
find
hat die -print0
Flagge, 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