我想找到一个文件,然后进入包含该文件的目录。我尝试过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 ) :find
pwd
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进程的当前工作目录就被改变了。
请参阅其他答案以了解该怎么做。