这就是为什么运行xargs cd不能工作的原因。

这就是为什么运行xargs cd不能工作的原因。

我想找到一个文件,然后进入包含该文件的目录。我尝试过find /media/storage -name "Fedora" | xargs cd,但当然,我is not a directory犯了错误。

如何使用一行命令进入其父目录?

答案1

至少如果你有 GNU find,你可以用来-printf '%h'获取目录

       %h     Leading directories of file's name (all but the last ele‐
              ment).  If the file name contains no slashes (since it is
              in  the  current  directory)  the %h specifier expands to
              ".".

所以你可能可以这样做

cd "$(find /media/storage -name "Fedora" -printf '%h' -quit)"

在多个文件匹配的情况下,应该-quit防止出现多个参数。cd

答案2

如同钢制司机的解决方案,但结合使用-execdir(如果您find支持它,例如 GNU 或 FreeBSD ) :findpwd

cd "$(find /media/storage -name "Fedora" -execdir pwd \; -quit)"

-quit是可选的,如果只有一个结果并且爬行整个目录没有问题。在 NetBSD 上它存在-exit,而在 OpenBSD 上它不存在。

答案3

您可以让 find 在它找到的目录中运行一个新的 shell。

exec find /media/storage -name "Fedora" -execdir "$SHELL" \;

,之后当前目录将是其中包含名为 Fedora 的文件的目录。 ;)

显然,如果您以交互方式键入命令,这只会执行类似于您想要的操作。

答案4

已经有很多答案展示了如何解决该问题,以及如何获得有效的东西。然而,没有人说为什么它一开始就不起作用。

这就是为什么运行xargs cd不能工作的原因。

这与编写脚本来更改目录是同样的问题。

  • xargs启动一个新进程/脚本在新进程中运行。
  • cd更改此新进程的当前工作目录。
  • 新进程退出。

因此,不再存在的进程的当前工作目录已被更改。

然后你cd在 shell 中调用,它使用内置命令。它不会创建新进程。这样shell进程的当前工作目录就被改变了。


请参阅其他答案以了解该怎么做。

相关内容