Ich habe folgende Zeile in einem Skript:
find ~ Templates -maxdepth 0 -type d -empty
das funktioniert wie erwartet einwandfrei. Wenn ich mein Skript jedoch auf die Samba-Freigabe kopiere und es von dort aus ausführe ( bash myscript.sh
), find
wird das Verzeichnis nicht gefunden:
find: ‘Templates’: No such file or directory
$PATH-Variablen sind dieselben, tatsächlich konnte ich auch dafür keinen Grund finden.
Weiß jemand, warum sich find so verhält? Ist das ein Fehler oder verwende ich find
den Befehl falsch, wie ich es soll?
mit Ubuntu 19.10 und Bash 5.0
Antwort1
Sie erhalten die Meldung find: ‘Templates’: No such file or directory
, weil kein Unterverzeichnis Templates vorhanden ist
- entweder - ab dem Zeitpunkt, an dem Sie das Skript ausführen
- oder - in dem Verzeichnis, in das ein
cd
in Ihrem Skript nicht erwähnter
Ich frage mich, ob das alles ein Tippfehler ist und Sie meinten ~/Templates
. In jedem Fall sollten Sie ~
in einem Skript nicht verwenden, sondern stattdessen verwenden "$HOME"
, sodass der resultierende Pfad lautet "$HOME/Templates"
.
Antwort2
„Nein, da Templates das Verzeichnis ist, nach dem ich in einem ‚~‘ oder im Home-Verzeichnis des Benutzers suche.“
find ~ -maxdepth 0 -type d -empty -name Templates
Antwort3
Was lässt Sie glauben, dass Samba dieselben Umgebungsvariablen wie Linux hat?
Verwenden Sie den tatsächlichen/vollständigen Pfad zu dem Verzeichnis, in dem Sie suchen möchten, da es sich ~
nicht um ein Verzeichnis handelt und es wahrscheinlich leer ist. Aus diesem Grund behandelt find Templates
den Pfad und nicht das Suchmuster ( find: ‘Templates’: No such file or directory
).
Können Sie die Shell in Ihrem Samba-Verzeichnis starten und sehen, was sie ist $ pwd
? Sie können auch die gesamte Umgebung mit überprüfen $ set
;
Kapitel „Samba-Variablen verwenden“sagt, dass das Home-Verzeichnis %H
nicht ist ~
.
kleines Experiment:
$ ls -l | grep -E '^d' # to show there is 1 directory (tmp), which is not empty but doesnt have `Templates`
drwxr-xr-x 2 user group 24576 Mar 16 16:16 tmp
$ find Templates -maxdepth 0 -type d -empty # as if <path> (`~`) was empty
find: Templates: No such file or directory
$ find tmp Templates -maxdepth 0 -type d -empty # as if `~` was `tmp`
find: Templates: No such file or directory
Entweder ~
ist es leer (zuerst find ...
mit „leerem“ Pfad) oder Sie haben es nicht Templates
im gesuchten Pfad (zweitens find
).
$ touch Templates
$ find tmp Templates -maxdepth 0 -type d -empty # as if `~` was `tmp`
$ rm Templates; mkdir Templates
$ find tmp Templates -maxdepth 0 -type d -empty # as if `~` was `tmp`
Templates
Wenn
Templates ist das Verzeichnis, nach dem ich in einem '~' oder im Home-Verzeichnis des Benutzers suche
Dann
$ find ~ -maxdepth 1 -type d -empty -name Templates
~/Templates
Sollte das Problem lösen.
-maxdepth 0
wendet die Tests und Aktionen nur auf die Kommandozeilenargumente an (gemäßMann finden; siehe auchdiese Antwort)