Ich versuche, eine Bash-Funktion zu erstellen, die eine einfache Datei wie z
sample.txt
start=22 Mar 2016 10:00
end=22 Mar 2016 12:09
... und finde Dateien, die ich in / usr / local innerhalb des durch start und end festgelegten Zeitraums installiert habe.
Die Funktion, die ich ursprünglich erstellt habe, ist:
function findInstalled () {
if [[ $# -ne 1 ]]; then
echo "[ERROR] Usage: findInstalled /path/to/file" ;
return 1;
fi
start=$( grep start $1 | cut -d'=' -f2 ) ;
end=$( grep end $1 | cut -d'=' -f2 ) ;
if [[ ! -z $start ]]; then
start="-newerct \"${start}\"" ;
fi
if [[ ! -z $end ]]; then
end="! -newerct \"${end}\"" ;
fi
echo find /usr/local $start $end -type f ;
find /usr/local $start $end -type f ;
}
..und die Ausführung der Funktion ergibt folgende Ausgabe:
$ findInstalled /path/to/sample.txt
find /usr/local -newerct "22 Mar 2016 10:00" ! -newerct "22 Mar 2016 12:09" -type f
find: I cannot figure out how to interpret `"22' as a date or time
Die tatsächliche Ausführung des Befehls gibt den Fehler an ...cannot figure out how to interpret...
. Wenn ich jedoch die Echo-Version des Befehls kopiere und einfüge, wird der Befehl erfolgreich ausgeführt. Irgendeine Idee, wo das Problem liegt? Beachten Sie, dass ich mit und ohne alle möglichen Kombinationen von Doppel-Qoutes und Einzel-Qoutes ausprobiert habe und keine davon funktioniert hat.
Ich habe die Funktion aktiviert, obwohl nicht ganz so, wie ich es wollte, indem ich stattdessen Folgendes mache:
function findInstalled () {
if [[ $# -ne 1 ]]; then
echo "[ERROR] Usage: findInstalled /path/to/file"
return 1;
fi
start=$( grep start $1 | cut -d'=' -f2 ) ;
end=$( grep end $1 | cut -d'=' -f2 ) ;
find /usr/local -newerct "$start" ! -newerct "$end" -type f ;
}
Auf diese Weise habe ich mein ursprüngliches Ziel erreicht, aber ich bin gespannt, warum meine ursprüngliche Funktion nicht funktioniert oder ob es überhaupt möglich ist.
quelle
"22
der einzige Wert war, für den ich gesorgt hatte-newerct
. Nachdem ich den Abschnitt zur Wortteilung im Bash-Handbuch gelesen hatte, versuchte ich, meine ursprüngliche Funktion zumIFS
Laufen zu bringen, indem ich sie in eine temporäre Variable speicherte und tatunset IFS
, aber dies funktionierte immer noch nicht. Am Ende ging ich zu Ihremfind
Vorschlag über, da es immer noch funktioniert, wenn Start- / Endwerte in der Quelldatei leer sind. Dies war das, was ich ursprünglich über das! -z
s erreichen wollte.