cd, просто набравши ім'я каталогу?


58

У мене це було десь 20 років тому, або я мріяв про це.

В основному:

Якщо тип blobblobя отримую
blobblob: command not found

Досить справедливо.

Мені б хотілося, щоб коли моя оболонка отримує ці помилки - команда не знайдена - вона перевіряє, чи існує каталог з цим ім'ям ('blobblob') і чи робить це cdв цьому каталозі.

Я впевнений, що є деякі причини, щоб цього не робити чи робити це обережно.
Я просто думаю, що це було б досить акуратно, але я хотів би спробувати це, знайшовши, як десь (як тут!).

Я поняття не маю, як зробити програмування свого роду оболонок, це може означати.

Відповіді:


76
  • Bash: shopt -s autocd
  • Zsh: setopt autocd
  • tcsh: set implicitcd

Також «автоперемикач» є корисним інструментом. Після встановлення він запам'ятовує каталоги, так що ви можете вводити j abc, і якщо ви раніше відвідували abc, скажімо, x / d / f / g / t / abc, тоді він буде там CD!
https://github.com/joelthelion/autojump


1
Так, я набрав shopt -s autocdкомандний рядок у ньому. Тепер я можу просто почати вводити імена каталогів і використовувати автозаповнення, а потім натиснути return і оболонку cdв каталог. Так кльово !
Майкл Дюрант

6
Чудово. Дякуємо, що вказали на невдачу, яку слід уникати.
фонбранд

3
Я не використовую цього - cdце не так важко набрати, і більшість механізмів заповнення вкладок розумніші, коли ви надаєте їм більше контексту.
jw013

Після зворотного вигуку вдячності, дозвольте сказати, що autocd - це справді правильна відповідь: D
Люк

autocdShopt був доданий в Баш версії 4. Так що не доступно на MacOS (який до цих пір Баш версії 3.xx) , якщо заступник, чи не буде встановлений новий Баш (наприклад, з допомогою доморощеного).
Квінн Комендант

2

Утиліта autojump забезпечує аналогічний механізм з Найбільш завантаженим списком каталогів. Однак це вимагає додаткового набору тексту, jSpaceале це компенсується вгадуванням права частіше, ніж ні.

Це найближче до DWIM, яке я раніше використовував.


1

Я колись зробив корисний сценарій для подібної мети, з функцією fcd для find-n-cd.

Ви набираєте fcd fooі може статися 3 речі:

  • Такого каталогу foo не знайдено, він повертається за допомогою "no such directory " $1
  • Знайдено один файл: він перевіряє, чи це каталог (чи просто файл), і якщо так, він там міститься.
  • Знайдено декілька файлів - тоді подається вибір, де ви просто набираєте номер виділення (або спеціальний номер для повернення).

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

#!/bin/bash
#
# find cd. For input foo, find all directories .../.../foo 
# GPLv3 Stefan Wagner (2010, 2012)
#
# doesn't handle blanks in directory names gracefully.
#
fcd () 
{
    list=$(locate $1 | egrep "/$1$")
    count=$(echo $list | wc -w )
    case $count in 
      0) 
        echo "unknown directory: "$1 && return
        # could search for partial matches Doc => Documentation
        ;;
      1) 
        if [[ -d "$list" ]]; then
        echo "$list";
        cd "$list";
        else
            echo "not a directory: $1"
        fi
        ;;
      *) 
        select directory in $list "/exit/" 
        do
          if [[ "$directory" = "/exit/" ]]; then break; fi
          if [[ -d "$directory" ]]; then
                echo "$directory";
                cd "$directory";
            break
          else
            echo "not a directory: "$1 
          fi
        done     
        ;;
   esac
}

Ви повинні sourceфункціонувати ( source fcd.sh| . fcd.sh) і не можете називати це сценарієм, тому cdщо в іншому випадку це трапиться лише в контексті сценарію, і після завершення ви негайно повернетеся до свого початкового режиму.

Оскільки він працює з ним locate, він досить швидко шукає каталоги (але не завжди актуальні).

Він не граціозно обробляє пробіли в іменах каталогу. Якщо у вас є елегантне рішення проблеми, я був би радий.


1
Питання полягало в cdавтоматичному, без введення жодної команди. Ця відповідь більше підходить для швидкої навігації по каталогу в терміналі .
манатство

2
@manatwork: Ну, ви можете комбінувати команду з обробкою помилок bash. У /etc/bash.bashrcubuntu є, function command_not_found_handleяке виглядає так, ніби його можна було змінити.
користувач невідомий

Зробив тебе. Цей спосіб звучить набагато краще.
манастирські роботи

@manatwork: Я би зробив це сам, якщо хотів би сам ним користуватися. Але якщо я хочу змінити каталог, я люблю використовувати коротку команду, але якщо я щось неправильно ввожу, я рідко забув набрати 3 або 4 символи. Здійснення цього кроку програми було б для мене досить дратує, але явно використовувати його добре.
користувач невідомий

1

Це також працює,

cdf name_of_file_or_directory

.. пробачте, що ви створили користувацький скрипт cdf.sh (внизу), розміщений в оболонці. Для каталогу в якості параметра цей скрипт потрапляє лише до батьківського каталогу для знайденого каталогу. Додайте наступний рядок у свій .bashrc або .zshrc, будь-який ..

source ~/bin/cdf.sh 

І додайте цей код у файл ~ / bin / cdf.sh, який потрібно створити з нуля.

#!/bin/bash

function cdf() {
    THEFILE=$1
    echo "cd into directory of ${THEFILE}"
    # For Mac, replace find with mdfind to get it a lot faster. And it does not need args ". -name" part.
    THEDIR=$(find . -name ${THEFILE} |head -1 |grep -Eo "/[ /._A-Za-z0-9\-]+/")
    cd ${THEDIR}
}

Чудова відповідь на старе запитання. Я вірю, що ви отримаєте значок для відновлення старого питання, і ласкаво просимо до U&LSE
eyoung100

0

Покладіть це у своє ~/.bashrc

  #aliases to cd into the core dirs
  PROJECT_PARENT_DIRS[0]="$HOME/repos"
  #you can make it search more dirs by assigning new indexes to your other root dirs

  for PARENT_DIR in ${PROJECT_PARENT_DIRS[@]} ; do
    if [ -d "$PARENT_DIR" ]; then
      for PROJECT_DIR in $(/bin/ls $PARENT_DIR); do
        if [ ! -z `which $PROJECT_DIR` ]; then
          continue # don't set alias if there is something already a command on the path with the same name
        fi
        if [ -d "$PARENT_DIR/$PROJECT_DIR" ]; then
          alias "$PROJECT_DIR"="cd $PARENT_DIR/$PROJECT_DIR"
        fi
      done
    fi
  done
  #end alias
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.