Существует ли острота, которая позволяет мне создавать каталог и перемещаться в него одновременно?

Еще более простой подход: Откройте Filezilla (или Ваш любимый браузер ftp), откройте соединение SSH для того же сайта, найдите файл и перетащите его через к Вашей локальной файловой структуре. Если Вы плохо знакомы с Filezilla, используйте функцию "начальника отдела" для повторного подключения быстро в следующий раз.

Да, я знаю, что это очевидно для большинства из Вас (и не точно на точке), но некоторые (как я), кто нашел, что этот поток, ищущий решение только для терминала, возможно, пропустил очевидное.

158
31.01.2013, 00:11
11 ответов

Нет никакой встроенной команды, но можно легко записать функцию, которая звонит mkdir затем cd:

mkcd () {
  mkdir "$1"
  cd "$1"
}

Вставьте этот код Ваш ~/.bashrc файл (или ~/.kshrc для ksh пользователей, или ~/.zshrc для zsh пользователей). Это определяет вызванную функцию mkcd. "$1" будет заменен аргументом функции, когда Вы выполните его.

Эта простая версия имеет несколько дефектов:

  • Вы не можете создать цепочку подкаталогов сразу. Зафиксируйте: передайте -p опция к mkdir. (Это может или не может быть желательно, поскольку это увеличивает риск опечатки, идущей необнаруженный, например. mkcd mydierctory/newsub счастливо создаст mydierctory и mydierctory/newsub когда Вы означали создавать newsub в существующем mydirectory.)
  • Если аргумент начинается - но не просто -, затем mkdir и cd интерпретирует его как опцию. Если это справедливо -, затем cd интерпретирует его для значения $OLDPWD. Если это + сопровождаемый 0 или больше цифрами, затем cd в zsh интерпретирует его как индекс в стопке каталога. Можно решить первую проблему, но не другие два, путем передачи -- перед аргументом. Можно решить все эти проблемы путем предварительного ожидания ./ к аргументу, если это - относительный путь.
  • mkdir не следует CDPATH, но cd делает, поэтому если Вы установили CDPATH к значению, которое не начинается . (по общему признанию несколько необычная конфигурация), затем cd может принести Вам к другому каталогу, чем тот, который был просто создан. Предварительное ожидание ./ к относительным путям фиксирует это (это вызывает CDPATH быть проигнорированным).
  • Если mkdir сбои, это пытается выполниться cd. Зафиксируйте: использовать && разделить две команды.

Все еще довольно простой:

mkcd () {
  case "$1" in /*) :;; *) set -- "./$1";; esac
  mkdir -p "$1" && cd "$1"
}

Эта версия все еще имеет потенциал для создания 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 никогда потребности не видеть никого ..).

Мы приезжаем в это устойчивое если немного окровавленная версия:

mkcd () {
  case "$1" in
    */..|*/../) cd -- "$1";; # that doesn't make any sense unless the directory already exists
    /*/../*) (cd "${1%/../*}/.." && mkdir -p "./${1##*/../}") && cd -- "$1";;
    /*) mkdir -p "$1" && cd "$1";;
    */../*) (cd "./${1%/../*}/.." && mkdir -p "./${1##*/../}") && cd "./$1";;
    ../*) (cd .. && mkdir -p "${1#.}") && cd "$1";;
    *) mkdir -p "./$1" && cd "./$1";;
  esac
}

(Осуществление: почему я использую подоболочку для первого cd звонить?)

Если mkdir перестал работать, я хочу убедиться не изменить текущий каталог. Возврат с CD - или $OLDPWD не достаточно хорош, если оболочка не имеет разрешения измениться в его текущий каталог. Кроме того, вызов CD обновляет OLDPWD, таким образом, мы только хотим сделать это однажды (или восстановить OLDPWD).


Существуют также менее специализированные способы не должным быть перепечатать слово от предыдущей строки:

  • Ввести cd , затем Esc. (или Высокий звук +.) для вставки последнего аргумента от предыдущей команды.
  • cd !$ выполняется cd на последнем аргументе предыдущей команды.
  • Нажмите Up, чтобы вспомнить предыдущую командную строку, затем отредактировать его для изменения mkdir в cd.
167
27.01.2020, 19:27
  • 1
    Спасибо! Esc. кажется самым удобным для меня, сочетание клавиш имеет какое-либо особое значение? папки –  methodofaction 12.03.2011, 03:36
  • 2
    Это - просто Bash (и наследованный от ksh, и также работы в zsh) последовательность для "повторения длится слово предыдущей команды". Я использую его довольно часто. –  geekosaur 12.03.2011, 03:46
  • 3
    @Gilles я начинаю думать, что учетная запись "Gilles" на самом деле совместно используется группой специалистов. ;-) –  Keith 12.03.2011, 05:24
  • 4
    @StephaneChazelas /a/b/..// на самом деле работал бы, но нет /a/b/../c. Фиксированный. Я поставил вопрос более широкой аудитории. –  Gilles 'SO- stop being evil' 31.01.2013, 00:26
  • 5
    mkcd() { mkdir -p "$1" && cd "$1"; } кажется, не проблема в (мой экземпляр) zsh. mkdir -p /var/tmp/somewhere/else /tmp/here; cd /tmp/here; 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.01.2015, 20:39

Это никогда не происходило бы со мной к сценарию это поведение, потому что я ввожу следование почти почасового основания...

$ mkdir someDirectory<ENTER>
$ cd !$

где удар любезно занимает место !$ с последним словом последней строки; т.е. долгое имя каталога, которое Вы ввели.

Кроме того, завершение имени файла является Вашим другом в таких ситуациях. Если бы Ваш новый каталог был единственным файлом в папке, то быстрая двойная ВКЛАДКА дала бы Вам новый каталог, не повторно вводя его.

Хотя здорово, что удар позволяет Вам сценарию такие общие задачи, как другие ответы предлагают, чтобы я думал, что лучше изучить особенности редактирования командной строки, которые должен предложить удар так, чтобы, когда Вы работаете над другой машиной, Вы не пропускали синтаксический сахар, который обеспечивают Ваши пользовательские сценарии.

30
27.01.2020, 19:27

Согласно Каким настройкам Вы сделали на своем профиле оболочки для повышения производительности?, это - то, как я делаю это:

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

это означает, что это также работает, если каталог уже существует.

17
27.01.2020, 19:27
  • 1
    -p опция к mkdir подавит ошибки. –  glenn jackman 12.03.2011, 07:42
  • 2
    mcd, уже существующая команда. Хотя Вы только что дали пример, я использовал его сам, поскольку это - буква короче, чем mkcd. –  Dharmit 13.04.2011, 17:44
  • 3
    @Dharmit: Каково существующее mcd команда? Какой пакет или проект обеспечивают эту команду? –  Mikel 14.04.2011, 01:05
  • 4
    mtools обеспечивает команду mcd. В его странице справочника говорится, что "Команда mcd используется для изменения mtools рабочий каталог на диске MS-DOS". –  Dharmit 14.04.2011, 09:11

Или Вы могли просто создать короткую переменную на лету и использовать ее дважды x = longproject ; mkdir $x ; cd $x - то, которое я допускаю, еще длиннее, чем использование функции сценария оболочки :)

3
27.01.2020, 19:27

Это то, что вам нужно. Никакой другой конфигурации не требуется:

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)

142
27.01.2020, 19:27

Если вы используете Oh My Zsh, есть команда под названием take , которая делает именно это. Это выглядело бы примерно так.

take myfolder

Я нашел это случайно. Я только что посмотрел, и он указан в этом читшите из вики Oh My Zsh на GitHub. Это довольно полезная команда, которую, по-видимому, очень легко создать самостоятельно.

15
27.01.2020, 19:27

Я сделал скрипт, который создает каталог, а затем cd'шник, затем я дал ему псевдоним. И вот gist, где я описываю это.

https://gist.github.com/rehnen/34236d6ff270ccaa74b6#mkdir-like-it-was-meant-to-be

-1
27.01.2020, 19:27

Вот небольшой вариант, достойный упоминания:

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

Добавьте это в свой ~/.bash_profile, и вы сможете использовать mkdirкак обычно (после того, как source'сделал это), за исключением того, что теперь будет выполняться указанная выше функция, а не стандартная команда mkdir.

Обратите внимание, что это не подтверждает ввод в соответствии с принятым ответом Жиля, но демонстрирует, как вы можете (эффективно) переопределить встроенные функции.

Из документации(слегка перефразируя):

команда mkdir [args]запускает mkdirс аргументами, игнорируя любую функцию оболочки с именем mkdir . Выполняются только встроенные команды оболочки или команды, найденные при поиске в PATH. Если есть функция оболочки с именем ls, запуск команды lsвнутри функции выполнит внешнюю команду lsвместо рекурсивного вызова функции

. встроенныйдает тот же результат, что и command.

0
27.01.2020, 19:27

Добавление вспомогательной функции в BASH, ZSH или KSH

Создайте команду mkcdдля вашей среды в одну строку

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

Это просто сделать в скрипте/функции bash. Я создал очень удобочитаемое и достаточно документированное руководство, включающее сценарии, которые работают как в Linux, так и в MacOS (, оно также будет поддерживаться в будущем ).

Моя цель по сложности туториала :написана для целевой аудитории, единственным условием является то, что у пользователя есть пульс и он может читать по-английски, поэтому, пожалуйста, оставьте отзыв, если вам нужна помощь.

https://github.com/craigopie/shellscripts

mcdir() {
  if [ $# -eq 0 ] || [ $1 = "-h" ] || [ $1 = "--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 [ $1 = "-p" ] || [ $1 = "--path" ]
    then
      mkdir -p "$2" &>/dev/null
      if [ $? -gt 0 ]
        then
          echo "There was a problem creating your directory."
          return 1
      fi
      cd "$2" &>/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 "$1" &>/dev/null
  if [ $? -gt 0 ]
    then
      echo "There was a problem creating your directory."
      return 1
  fi
  cd "$1" &>/dev/null
  if [ $? -gt 0 ]
    then
      echo "Unable to change into that directory."
      return 1
  fi
  return 0
}
export -f mcdir

Чтобы установить это, у вас есть два варианта:

  • Во-первых, добавьте функцию в ваш .bashrcфайл.
  • Второй — добавить файл к вашему пути, а затем указать источник файла в вашем файле .bash_profile.

Опять же, в файле README очень подробно описано, как это сделать.

Удачи!

1
07.05.2020, 07:54

Если вы используете команду Oh -my -zsh, takeпоможет. Взгляните на шпаргалку .

0
06.07.2020, 00:49

Теги

Похожие вопросы