Wenn ich diesen Befehl ausführe, funktioniert es:
$ find . -inum 888696 -exec ls '{}' \;
Conversation.pst Outlook Data File Outlook Data File.sbd Trash Unsent Messages
Inbox.pst Outlook Data File.msf Sent.pst Trash.msf Unsent Messages.msf
Allerdings Beim Austausch ls
mit cd
ihm funktioniert nicht funktioniert:
$ find . -inum 888696 -exec cd '{}' \;
find: ‘cd’: No such file or directory
Ich weiß, dass cd
es bash
eingebaut ist, also habe ich es versucht, was auch nicht funktioniert:
$ find . -inum 888696 -exec builtin cd '{}' \;
find: ‘builtin’: No such file or directory
Wie kann ich cd
zusammen mit find -exec
Befehl verwenden?
AKTUALISIEREN
Der Grund , warum ich versuchen zu verwenden , cd
mit find -exec
, dass der Verzeichnisname ein seltsames ist , die zeigt , auf meinem Terminal als so etwas wie ????
.
bash
find
cd-command
user3405291
quelle
quelle
LC_ALL=C printf '%q\n' *
ASCII-Namen für alle Dateien in Ihrem aktuellen Verzeichnis drucken, eine in eine Zeile (Ändern von Zeilenumbrüchen in$'\n'
oder ähnliches).Antworten:
Die
-exec
Option zumfind
Ausführen eines externen Dienstprogramms, möglicherweise mit einer Befehlszeilenoption und anderen Argumenten.Ihr Unix wird nicht
cd
als externes Dienstprogramm bereitgestellt, sondern nur als integrierte Shell.find
Daher kann es nicht ausgeführt werden. Mindestens macOS und Solaris Sie bietencd
als externes Dienstprogramm.Es würde wenig oder gar keine Verwendung für die Ausführung
cd
auf diese Weise geben, außer um zu testen, ob der von gefundene Pfadnamefind
ein Verzeichnis ist, in das Sie gelangen könntencd
. Das Arbeitsverzeichnis in Ihrer interaktiven Shell (oder was auch immer aufgerufen wirdfind
) würde sich sowieso nicht ändern.Verbunden:
Wenn Sie Probleme mit dem Namen eines Verzeichnisses haben, das seltsam oder äußerst schwierig einzugeben ist, und Sie in dieses Verzeichnis wechseln möchten, sollten Sie einen symbolischen Link zum Verzeichnis erstellen und
cd
stattdessen diesen Link verwenden:Dies würde einen symbolischen Link mit dem Namen erstellen
thedir
, der auf das problematische Verzeichnis verweist. Sie können dann das Arbeitsverzeichnis mit ändern(wenn der Link im aktuellen Verzeichnis vorhanden ist). Dadurch wird vermieden, dass das Verzeichnis in irgendeiner Weise geändert wird. Eine andere Idee wäre, das Verzeichnis auf ähnliche Weise mit umzubenennen
find
, aber das wäre nicht ratsam, wenn ein anderes Programm erwartet, dass das Verzeichnis diesen bestimmten Namen hat.quelle
cd
mitfind -exec
, dass die Verzeichnisnamen in einigen seltsamen Zeichen sind , die korrekt auf meinem Terminal nicht angezeigt.cd
in ein Verzeichnis gehen, das einen schlechten Namen hat, und ich kann es nichtcd
auf normale Weise betreten./bin/cd
ein Ergebnis von POSIX ( pubs.opengroup.org/onlinepubs/9699919799/utilities/… ) ist, bei dem die normalen Builds für exec () zugänglich sein müssen. Natürlich macht/bin/cd
wahrscheinlich nicht, was die Leute wollen :-)find
führt den-exec
Befehl selbst aus, es handelt sich nicht um eine Shell. Selbst wenn dies der Fall wäre, würde der Verzeichniswechsel nur so lange bestehen bleiben, bis diese Shell unmittelbar nach dem beendet wirdcd
.Sie müssen den Dateinamen in die aktuelle Shell übertragen, um ihn
cd
zu speichern. Abhängig davon, wie schlecht Ihre Dateinamen sind, können Sie die Befehlsersetzung verwenden:Dies funktioniert nicht, wenn der Dateiname in einer neuen Zeile endet, da die Befehlsersetzung nachfolgende Zeilenumbrüche verschlingt. In diesem Fall müssten Sie die neue Zeile schützen und die
find
beim Drucken hinzugefügte entfernen :Oder lassen Sie mit GNU
find
die nachfolgende neue Zeile nicht drucken (schützen Sie jedoch alle im Dateinamen):Verwenden Sie auch das
-quit
Prädikat (auch eine GNU-Erweiterung), um die erste Übereinstimmung nicht mehr als Optimierung zu betrachten.Alternativ können Sie eine neue Shell von innen starten
find
, aber es ist ein bisschen hässlich:quelle
find
selbst beim Drucken hinzugefügt wird . Bearbeitet.dir=$(find -print0)
wird immer noch die nachfolgende Newline des Dateinamens in den Papierkorb werfen ...Nicht mit exec, aber das kann gut genug für Sie sein:
Der "-Typ d", nur um sicherzugehen. Von was weiß ich nicht wirklich.
quelle
mkdir $'foo\n'
funktioniert hier perfekt; Ich habe noch kein natives UNIX-Dateisystem gesehen, in dem es nicht unterstützt wurde.Verwenden Sie einen durch NUL getrennten Stream, um die Ausgabe zu lesen
find
, die in allen Fällen funktioniert - einschließlich Namen, die in Zeilenumbrüchen enden. Sie können auchprintf '%q'
eine lesbare Darstellung eines Dateinamens erstellen.quelle
Wenn Sie diese Meldung erhalten, ist Ihre Betriebssystemplattform fehlerhaft. Der POSIX-Standard verlangt, dass ein benannter Befehl
cd
im Dateisystem verfügbar sein muss, damit er über aufgerufen werden kannexec()
.Nun die schlechten Nachrichten für Sie:
Selbst wenn Ihre Betriebssystemplattform nicht fehlerhaft war, haben Sie keine Warnung gesehen, aber Sie haben nicht die erwarteten Ergebnisse erhalten, da es Ihnen nicht hilft, wenn ein separates Programm sein aktuelles Arbeitsverzeichnis ändert und sofort danach stirbt.
Wenn Sie einen effektiven
cd
Befehl ausführen möchtenfind
, können Sie Folgendes tun:quelle
sh
Nicht- Zitieren einer Parametererweiterung eine ganz besondere Bedeutung hat und nicht etwas, das Sie tun möchten. Es ist besser, Dummy- Werte für diese Inline -Skripte zu vermeiden ,$0
da diese beispielsweise in Fehlermeldungen verwendet werden (z. B. wenncd
dies fehlschlagen würde).cd "$1"
? Wenn der Name schwer zu tippen ist, kann er auch Shell-Metazeichen enthalten ...