Lorsque j'exécute cette commande, cela fonctionne:
$ 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
Cependant, lorsque le remplacer ls
par cd
cela ne fonctionne pas :
$ find . -inum 888696 -exec cd '{}' \;
find: ‘cd’: No such file or directory
Je sais que cd
c'est un bash
intégré, j'ai donc essayé cela qui ne fonctionne pas non plus:
$ find . -inum 888696 -exec builtin cd '{}' \;
find: ‘builtin’: No such file or directory
Comment puis-je utiliser cd
avec la find -exec
commande?
MISE À JOUR
La raison pour laquelle je suis en train d'utiliser cd
avec find -exec
est que le nom du répertoire est un étrange qui apparaît sur mon terminal comme quelque chose comme ????
.
bash
find
cd-command
user3405291
la source
la source
LC_ALL=C printf '%q\n' *
imprimer les noms ASCII de tous les fichiers de votre répertoire actuel, un sur une ligne (en changeant les retours à la ligne$'\n'
ou similaires).Réponses:
L'
-exec
option pourfind
exécuter un utilitaire externe, éventuellement avec une option de ligne de commande et d'autres arguments.Votre Unix ne fournit pas en
cd
tant qu'utilitaire externe, uniquement en tant que shell intégré, doncfind
ne parvient pas à l'exécuter. Au moins macOS et Solaris ne fournircd
comme un utilitaire externe.Il serait peu ou pas utile de l'exécuter
cd
de cette manière, sauf pour tester si le chemin d'accès trouvé parfind
est un répertoire dans lequel vous pourriez le fairecd
. Le répertoire de travail dans votre shell interactif (ou quoi que ce soit qui appellefind
) ne changerait pas de toute façon.En relation:
Si vous rencontrez des problèmes avec le nom d'un répertoire étrange ou extrêmement difficile à taper, et que vous souhaitez passer à ce répertoire, envisagez de créer un lien symbolique vers le répertoire, puis
cd
à l'intérieur en utilisant ce lien à la place:Cela créerait un lien symbolique nommé
thedir
qui pointerait vers le répertoire problématique. Vous pouvez ensuite modifier le répertoire de travail avec(si le lien existe dans le répertoire courant). Cela évite de modifier le répertoire en aucune façon. Une autre idée serait de renommer le répertoire de la même manière avec
find
, mais ce ne serait pas conseillé si un autre programme s'attend à ce que le répertoire ait ce nom particulier.la source
cd
avecfind -exec
est que les noms de répertoire sont en caractères étranges qui ne s'affichent pas correctement sur mon terminal.cd
entrer dans un répertoire qui a un mauvais nom, et je ne peux pas ycd
entrer normalement./bin/cd
est drôle, c'est que c'est le résultat de POSIX ( pubs.opengroup.org/onlinepubs/9699919799/utilities/… ) où les fonctions internes normales doivent être accessibles à exec (). Bien sûr,/bin/cd
ne fait probablement pas ce que les gens veulent :-)find
exécute la-exec
commande elle-même, elle n'implique pas de shell. Même si c'était le cas, le changement de répertoire ne persisterait que jusqu'à la fermeture de ce shell, immédiatement après lecd
.Vous devrez récupérer le nom du fichier dans le shell actuel
cd
. Selon la gravité de vos noms de fichiers, vous pouvez utiliser la substitution de commandes:Cela ne fonctionnera pas si le nom de fichier se termine par une nouvelle ligne, car la substitution de commandes mange les nouvelles lignes de fin. Dans ce cas, vous devez protéger la nouvelle ligne et vous débarrasser de celle
find
ajoutée lors de l'impression:Ou, avec GNU
find
, n'imprimez pas la nouvelle ligne de fin (mais protégez-en tout dans le nom de fichier):Utiliser également le
-quit
prédicat (également une extension GNU) pour arrêter de chercher la première correspondance comme une optimisation.Alternativement, vous pouvez démarrer un nouveau shell de l'intérieur
find
, mais c'est un peu moche:la source
find
lors de l'impression. Édité.dir=$(find -print0)
sera de même pour la nouvelle ligne de fin du nom de fichier ...Pas avec exec, mais cela peut être suffisant pour vous:
Le "-type d", juste pour être sûr. De quoi, je ne sais pas vraiment.
la source
mkdir $'foo\n'
fonctionne parfaitement ici; Je n'ai pas encore vu de système de fichiers UNIX natif où il n'était pas pris en charge.Utilisez un flux délimité par NUL pour lire la sortie
find
qui fonctionne dans tous les cas - y compris les noms qui se terminent par des retours à la ligne. Vous pouvez également utiliserprintf '%q'
pour générer une représentation lisible d'un nom de fichier.la source
Si vous obtenez ce message, votre plate-forme OS est boguée. La norme POSIX requiert qu'une commande nommée
cd
soit disponible dans le système de fichiers pour pouvoir être appelée viaexec()
.Maintenant, la mauvaise nouvelle pour vous:
Même si votre plate-forme de système d'exploitation n'était pas boguée, vous n'avez tout simplement pas vu d'avertissement, mais vous n'avez pas obtenu les résultats attendus, car cela ne vous aide pas si un programme distinct change son répertoire de travail actuel et meurt immédiatement après cela.
Si vous aimez avoir un efficace
cd
dans une commande exécutée parfind
, vous pouvez faire quelque chose comme:la source
sh
, pas quelque chose que vous voudriez faire. Il vaut mieux éviter les valeurs fictives pour ce script en ligne$0
car il est utilisé dans les messages d'erreur par exemple (comme quand celacd
échouerait).cd "$1"
? Si le nom est difficile à taper, il peut aussi contenir des métacaractères shell ...