我发现自己重复了很多:

 mkdir longtitleproject
cd longtitleproject
 


有没有办法做到这一点?一行而不重复目录名称?我在这里重击。

评论

来自unix.stackexchange.com/questions/6628/…的cd
相关(但更通用):在一个参数上运行两个命令(不带脚本)。

mkdir longtitleproject然后cd!^

也已在askubuntu.com/q/927463/295286和askubuntu.com/q/249314/295286
上进行了介绍。

#1 楼

这是您需要的一线。不需要其他配置:
mkdir longtitleproject && cd $_


以bash表示的$_变量是上一个命令的最后一个参数。在这种情况下,您刚刚创建的目录的名称。如man bash中所述:

_         At  shell  startup,  set to the absolute pathname used to invoke
          the shell or shell script being executed as passed in the  envi‐
          ronment  or  argument  list.   Subsequently, expands to the last
          argument to the previous command, after expansion.  Also set  to
          the  full  pathname  used  to  invoke  each command executed and
          placed in the environment exported to that command.  When check‐
          ing  mail,  this  parameter holds the name of the mail file cur‐
          rently being checked."$_" is the last argument of the previous command.


使用cd $_而不是cd !$来检索前一个命令的最后一个参数,因为cd !$在外壳程序历史记录中给出了前一个命令的最后一个参数:

cd ~/
mkdir folder && cd !$


你最终回到家(或〜/)

cd ~/
mkdir newfolder && cd $_


你最终回到家中的新文件夹!! (或〜/ newfolder)

评论


为什么在地球上这不是公认的答案

–JSmyth
16年7月24日在4:16

@JSmyth我同意,这是使用本机外壳功能的单行代码

– sming
16年8月8日在14:56

我认为OP正在尝试避免使用这两个命令。这个答案(几乎)与执行mkdir foo && cd foo一样有效,这并不方便。

– josemigallas
17年6月13日在13:08

OP要求的是一种单行,不需要重复目录名,就是这样

–耶苏斯·卡雷拉(JesúsCarrera)
17年6月13日在18:13

通过投票,很明显许多人发现此答案很有用。我将说明为什么我没有选择此答案:我很可能会输错&& cd $ _,因为这些键离主行太远了,所以虽然在技术上是正确的,但它并不符合人体工程学。我很欣赏这样一个事实,即它与环境无关,并且对了解它很有用。谢谢!

–作用方法
19年2月16日在22:06

#2 楼

没有内置命令,但是您可以轻松编写一个调用mkdir然后cd的函数:
mkcd () {
  mkdir ""
  cd ""
}

将此代码放入您的~/.bashrc文件中(对于ksh用户是~/.kshrc,对于zsh用户是~/.zshrc)。它定义了一个名为mkcd的函数。运行该函数时,""将替换为该函数的参数。
此简单版本具有多个缺陷:

您无法一次创建子目录链。修复:将-p选项传递给mkdir。 (这可能会或可能不会很理想,因为它会增加出现错字的风险,例如,当您要在现有mkcd mydierctory/newsub内创建mydierctory时,mydierctory/newsub会很高兴地创建newsubmydirectory。)
如果参数以-开头但是不只是-mkdircd会将其解释为一个选项。如果只是-,则cd会将其解释为$OLDPWD。如果是+后跟0或多个数字,则zsh中的cd会将其解释为目录堆栈中的索引。您可以通过在参数前传递--来解决第一个问题,但不能解决其他两个问题。如果是相对路径,可以在参数前添加./来解决所有这些问题。从mkdir(一种公认的有些不寻常的配置)开始,然后CDPATH可能会将您带到与刚刚创建的目录不同的目录。在相对路径前面加上cd可以解决此问题¹(这会导致忽略CDPATH)。
如果.失败,它将尝试执行cd。修复:使用./分隔两个命令。

仍然非常简单:
 CDPATH 

此版本仍然有可能使mkdir进入与cd在一个极端情况下创建的目录不同的目录:如果&&的参数包含mkcd () { case "" in /*) :;; *) set -- "./";; esac mkdir -p "" && cd "" } 并通过符号链接。例如,如果当前目录为cd,而mkdir是指向mkcd的符号链接,则..创建/tmp/here,而mylink变为/somewhere/else。在参数中查找符号链接是不够的,因为外壳程序还在其自己的当前目录中跟踪符号链接,所以mkdir mylink/../foo不会更改为新目录(/somewhere/else/foo)而是会更改为cd mylink/../foo。解决此问题的方法是让内置的foo首先解析所有cd /tmp/mylink; mkdir ../foo; cd ../foo路径组件(如果/somewhere/else/foo不存在,则不使用/tmp/foo,因此cd永远不需要看到任何..)。
我们来这个健壮的,如果有点血腥的版本:
 foo/.. 

(练习:为什么我在第一次foo调用中使用子外壳?)

如果mkdir失败,我想确保不要更改当前目录。如果外壳没有权限更改为当前目录,则使用cd-或$ OLDPWD进行更改是不够的。另外,调用cd会更新OLDPWD,所以我们只想执行一次(或恢复OLDPWD)。


还有一些不太专业的方法,不必重新输入上一行的单词:

输入mkdir,然后输入Esc。 (或Alt +。)以插入上一个命令的最后一个参数。

..对上一个命令的最后一个参数执行mkcd () { case "" in */..|*/../) cd -- "";; # that doesn't make any sense unless the directory already exists /*/../*) (cd "${1%/../*}/.." && mkdir -p "./${1##*/../}") && cd -- "";; /*) mkdir -p "" && cd "";; */../*) (cd "./${1%/../*}/.." && mkdir -p "./${1##*/../}") && cd "./";; ../*) (cd .. && mkdir -p "${1#.}") && cd "";; *) mkdir -p "./" && cd "./";; esac }
按Up调出上一个命令行,然后进行编辑请将cd更改为cd


¹但是请注意,由于cd !$版本已在93u + m / 1.0.0-alpha + d1483150 2021-中修复,因此它不适用于ksh93。 01-05

评论


谢谢! Esc。对我来说似乎最方便,按键顺序是否有特殊含义?

–作用方法
2011年3月12日在1:36

它只是“重复上一个命令的最后一个单词”的Bash(从ksh继承而来,并且也适用于zsh)序列。我经常使用它。

– geekosaur
2011年3月12日,下午1:46

@Gilles我开始认为“ Gilles”帐户实际上是由专家小组共享的。 ;-)

–基思
2011-3-12在3:24

@StephaneChazelas /a/b/..//实际上可以,但/a/b/../c则不行。固定。我已经把这个问题提给了更广泛的听众。

–吉尔斯'所以-不再是邪恶的'
13年1月30日在22:26



mkcd(){mkdir -p“ $ 1” && cd“ $ 1”;在(我的实例中)zsh似乎不是问题。 mkdir -p / var / tmp / somewhere / else / tmp / here; cd / tmp /这里; ln -s / var / tmp / somewhere / else mylink; mkdir -p mylink /../ foo && cd mylink /../ foo; pwd(包括设置和)显示/ tmp / here / foo,这是创建的(以及我期望的)。 bash错误地创建并更改为/ var / tmp / somewhere / foo。

–亚当·卡兹(Adam Katz)
15年1月15日在18:39



#3 楼

我几乎从来没有想过要编写这种行为,因为我几乎每小时都要输入以下内容... qb12078q
最后一行的最后一个单词;即您输入的长目录名。

此外,在这种情况下,文件名补全是您的朋友。如果您的新目录是文件夹中的唯一文件,则快速双TAB键将为您提供新目录而无需重新输入。

虽然bash允许您编写诸如其他答案建议我认为最好学习bash必须提供的命令行编辑功能,这样,当您在另一台计算机上工作时,您不会缺少自定义脚本提供的语法糖。

评论


有什么好地方可以找到最重要的bash怪癖?

–dominicbri7
2015年10月7日,下午2:48

@ dominicbri7通常位于“ bash命令行编辑”下。谷歌搜索相同,其结果如下:web.mit.edu/gnu/doc/html/features_7.html更具体地说,!$是Word指示符的示例,请参见gnu。 org / software / bash / manual / bashref.html#Word-Designators

–Rob
2015年10月7日14:19



#4 楼

如果您使用Oh My Zsh,则有一个名为take的命令可以做到这一点。看起来像这样。

take myfolder


我实际上是偶然发现的。我只是看了一下,并在Oh My Zsh GitHub Wiki的此作弊清单中列出了它。这是一个非常有用的命令,显然很容易创建自己。

评论


我从来不知道带:)完美!顺便说一句-iTerm2和Oh My Zsh。实际上,这里有3个完美答案。这个,@jesús-carrera的那个,然后选择答案。取决于您的设置和首选项。

–韦德
19年2月14日在2:12

#5 楼

根据您在外壳配置文件上进行了哪些自定义以提高生产力?,这就是我的方法:

# make a directory and cd to it
mcd()
{
    test -d "" || mkdir "" && cd ""
}


这意味着如果目录已经存在,它也可以工作。

评论


mkdir的-p选项将抑制错误。

–格伦·杰克曼
2011-3-12在5:42

mcd是已经存在的命令。尽管您只是举了一个例子,但我自己使用了它,因为它比mkcd短。

– Dharmit
2011年4月13日在14:44

@Dharmit Shah:现有的mcd命令是什么?哪个软件包或项目提供此命令?

– Mikel
2011年4月13日在22:05

mtools提供了mcd命令。它的手册页显示“ mcd命令用于更改MS-DOS磁盘上的mtools工作目录。”

– Dharmit
2011年4月14日在6:11

#6 楼

或者,您可以即时创建一个简短的变量并使用两次x = longproject ; mkdir $x ; cd $x-我承认,它比使用shellscript函数还更长:)

#7 楼

在bash脚本/函数中,这很简单。我创建了一个可读性强,文档充分的教程,其中包括可在Linux和MacOS上运行的脚本(以后也会维护)。

我对教程的复杂性的目标是:为目标受众编写唯一的先决条件是用户有脉冲并可以阅读英语,因此如果需要帮助,请提供反馈。

https://github.com/craigopie/shellscripts

 mcdir() {
  if [ $# -eq 0 ] || [  = "-h" ] || [  = "--help" ]
    then
      echo "Usage: [option...] {directory}"
      echo "   -p, --path                  Create all directories in path "
      echo "   -h, --help                  Shows this helpful information "
      echo
      return 0
  fi
  ## create directory with a path
  if [  = "-p" ] || [  = "--path" ]
    then
      mkdir -p "" &>/dev/null
      if [ $? -gt 0 ]
        then
          echo "There was a problem creating your directory."
          return 1
      fi
      cd "" &>/dev/null
      if [ $? -gt 0 ]
        then
          echo "Unable to change into that directory."
          return 1
      fi
      return 0
  fi
  ## create directory in this location
  mkdir "" &>/dev/null
  if [ $? -gt 0 ]
    then
      echo "There was a problem creating your directory."
      return 1
  fi
  cd "" &>/dev/null
  if [ $? -gt 0 ]
    then
      echo "Unable to change into that directory."
      return 1
  fi
  return 0
}
export -f mcdir
 


要安装此文件,您有两个选择:


第一个是添加将功能添加到您的.bashrc文件中。
第二个方法是将文件添加到路径中,然后在.bash_profile文件中获取文件。

再次,自述文件非常详细地介绍了如何做这个。

祝你好运!

#8 楼

这是一个值得一提的细微变化:

function mkdir() {
    local dir=
    command mkdir "$dir"  &&  cd "$dir"
}


将其添加到您的~/.bash_profile中,然后您就可以像平常一样使用mkdir(一旦完成source) ,但现在它将运行上面的功能,而不是标准的mkdir命令。

请注意,这不会根据Gilles接受的答案来验证输入,而是演示了如何(有效)覆盖内置函数。

从文档中(略有措辞):


command mkdir [args]使用mkdir运行args,而忽略了任何名为mkdir的shell函数。仅执行shell内置命令或通过搜索PATH找到的命令。如果有一个名为ls的shell函数,则在该函数中运行command ls会执行外部命令ls,而不是递归调用该函数。


我相信builtincommand会达到类似的结果。 />

评论


你绝对应该引用$ dir

– Jeff Schaller♦
17年9月6日在18:09

@Jeff同意,但是接受的答案包含了所需的所有验证。我只是介绍使用命令作为替代方法。

– Arj
17年9月7日在9:07

#9 楼

在BASH,ZSH或KSH中添加辅助功能

在一行中为您的环境创建mkcd命令

echo -e 'mkcd() {\n mkdir -p "" && cd $_\n}' >> ~/.${0//-/}rc && . ~/.${0//-/}rc


#10 楼

如果您使用的是Oh-my-zsh,则使用take命令可以解决问题。看看备忘单。

#11 楼

只需自动化上述答案,并制作一个一次性可执行脚本:

fun='
mkcd ()
{
    mkdir -p -- "" && cd -P -- ""
}'

echo "$fun" >> ~/.bashrc


只需将其复制到新文件mkcd.sh中,然后在bash mkcd.sh终端中仅运行一次即可。 />然后执行source ~/.bashrc以使其在当前会话中正常工作。

此后,您可以使用mkcd some_dir来创建并直接在该目录中输入。

评论


您建议编写一个脚本(在文件中),其唯一目的是将脚本追加到〜/ .bashrc文件中(并给出答案)?以及您如何建议创建此mkcd.sh脚本?也许有一位编辑?与仅编辑〜/ .bashrc相比,这似乎需要更多的工作。与公认的答案相比,这有什么优势? …………………………………………………………………………………………这会因为引用问题而失败,这告诉我您甚至还没有尝试过。

–斯科特
17年12月11日在20:52



我很遗憾地说,但是是的,正如我在回答中所写的那样,我使用了以上答案。确实有效。如果您不相信我,请尝试一下。关于不尝试,我用了整整一天的时间来用bash和python编写这样的脚本。

–微妙的寻求者
17年12月11日在21:11

我确实尝试过你写的东西。这是行不通的。

–斯科特
17年12月11日在21:21