Ich habe zwei Ordner mit ähnlichen Unterordnerstrukturen, die ich vergleichen möchte. Beispielsweise:
A
├── child-1
├── child-2
├── child-3
├── child-4
├── child-5
und
B
├── child-1-some-text
├── child-2-more-text
├── child-3-nothing
├── child-6-random-text
├── child-7-more-random-text
Ich möchte alle Unterordner auflisten, aus A
denen ein Unterordner vorangestellt ist, B
und auch die entsprechenden Unterordner auflisten B
. Die erwartete Ausgabe ist
child-1 -- child-1-some-text
child-2 -- child-2-more-text
child-3 -- child-3-nothing
Eine sekundäre Anforderung: Wenn mehrere Übereinstimmungen vorliegen B
, sollte ein Fehler / eine Warnung ausgegeben werden.
Meine Lösung :
cd A
for f in `ls -d */`;
do
cd B;
new_dirs=(`ls -1d $f*`);
cd -;
if [ ${#new_dirs[@]} -eq 0 ]
then
## DO_Nothing
continue;
elif [ ${#new_dirs[@]} -gt 1 ]
then
echo "Multiple matches to $f";
continue;
else
echo "Unique Match found to $f -- ${new_dirs[0]}";
continue;
fi;
done
Problem:
Für die Werte von $f
, die keine entsprechenden Unterordner enthalten B
, gibt mir die Array-Konstruktion einen Fehler. z.B:
ls: kann nicht auf 'child-4 *' zugreifen: Keine solche Datei oder kein solches Verzeichnis
Frage
- Wie kann man diese Fehler beseitigen?
- Gibt es einen besseren Weg, um die Ziele zu erreichen als das in meinem Code?
Danke im Voraus!
diff -rq DIR1 DIR2
damit nicht nur die Verzeichnisstruktur, sondern auch den Dateiinhalt vergleichen.Antworten:
Der bessere Weg
Analysiere nicht
ls
; Verwenden Sie stattdessen Globs. Tatsächlich verwenden Sie bereits Globs, wickeln sie einfach einls
, was sinnlos ist. Sie müssen nurnullglob
eingeschaltet sein, wenn keine Übereinstimmungen vorliegen.Auch das Vermeiden
cd
vereinfacht die Dinge.Ausgabe:
Ich habe hinzugefügt
B/child-3-something
, um die sekundäre Anforderung zu testen. Dadurch wird die Verzeichnisstruktur zum Testen erstellt:By the way, ShellCheck ist sehr nützlich für die Probleme in Shell - Skripten zu finden.
quelle
shellcheck
Pakets wäre am sichersten]ShellCheck
. Ich habe den Teil geliebt, in dem es Ihnen nicht nur Ihre Fehler sagt, sondern auch Vorschläge gibt! @ Xen2050, über den Hochladen Teil, Ich habe geradeshellcheck
mitapt
behindertem Netzwerk und dann. Es scheint ohne Internet zu funktionieren .Wenn Sie
ls
einen nicht vorhandenen Ordner aufrufen, wird die aufgetretene Fehlermeldung ausgegeben. Der einfache Weg ist, dies einfach zu ignorieren, indem Sie Zeile 5 in Ihrem Skript durch Folgendes ersetzen :new_dirs=(`ls -1d $f* 2> /dev/null`);
.quelle
t=(`echo ok; echo err 1>&2`)
$ t ausführe (oder${t[@]}
) nur ok enthält, wird err im Terminal angezeigt, aber trotzdem nicht gespeichert. Oder hat mein Test etwas Lustiges?