Как я могу записать cd в каталог без ввода имени?

cron делает это для вас уже. В вашей записи crontab говорится:

00 01 * * * sh /backup/script.sh

В назначенное время cron выполнит указанную вами команду и отправит вам по электронной почте свой вывод.

Вывод sh /does/not/exist: . Таким образом, cron отправит вам электронное сообщение, если файл не существует.

Возможно, вам нужно будет убедиться, что ваша система настроена правильно для электронной почты, так что cron сможет успешно отправить вам электронное письмо. Вы упомянули sendmail; если sendmail настроен правильно, а по электронной почте работает ваш пользователь, то cron тоже будет работать.

Переменная MAILTO также может помочь, если вам нужно отправить по электронной почте другой адрес или если по электронной почте ваш пользователь не работа, но отправка по электронной почте определенного интернет-адреса электронной почты. Просто добавьте строку MAILTO=foo@example.com над существующей строкой.

1
задан 12 October 2017 в 08:09

7 ответов

Любой объект в (большинстве) файловых систем в Linux имеет уникальный идентификатор, называемый inode. Обратите внимание, что файл может иметь более одного имени (hardlink), но каталоги имеют только одну ссылку во всех файловых системах, о которых я знаю. Обратите внимание, что концепция inode является локальной файловой системой, поэтому в двух разных устройствах (раздел или что-то еще) уникальность не гарантируется.

Вы можете увидеть индекс вашего каталога с помощью ls -ldi:

[:~] % ls -ldi tmp/uffa                     
20873234 drwxrwxr-x 2 romano romano 4096 Jun 26  2014 tmp/uffa

Итак, вы знаете, что ваш каталог имеет inode 20873234. Теперь вы можете переключиться на него с помощью команды:

[:~] % cd "$(find ~ -inum 20873234 2> /dev/null)"  
[:~/tmp/uffa] %

(Обратите внимание, что 2> /dev/null состоит в том, чтобы отключать сообщения об ошибках об нечитаемых каталогах по пути.)

Эта команда будет сканировать всю вашу домашнюю директорию, поэтому быть терпеливым.1

Но как насчет использования cd и завершения TAB вашей оболочки?

1 Это должна быть самой неэффективной вещью, которую я когда-либо публиковал ... одой для энтропии. Причина в том, что «первичный ключ», под которым оптимизируется доступ к файлу или каталогу, быстрый и прямой - угадайте, что? - путь: /dir/dir/file_or_dir. Более того, чтобы предоставить вам доступ к определенному каталогу, системе необходимо проверить все разрешения в пути ... так что снова обращение через inode означает рекурсивное сканирование файловой системы.

2 Ну, вы можете сделать что-то хуже, сканируя с / .3

3 Но тогда он выиграл ' t, потому что inodes уникальны только для каждой файловой системы (для каждого монтирования).

18
ответ дан 23 May 2018 в 18:23
  • 1
    Спасибо @ Романо. На самом деле я думал о проблеме. Я не знаю, что проблема превратится в такое неэффективное решение. Но подумайте о решении. Вы можете легко написать программу c и поместить ее в / bin, а затем попытаться выполнить ее с единственным номером inode. Я отправлю код, если я смогу написать такое мнение. – Maruf 8 August 2015 в 18:20
  • 2
    а также, думаю, мне нужно знать. Я понимаю первую часть этой команды. " $ (найти ~ -inum 20873234 ******) " , но я не знаю, почему вы пишете это, " 2 & gt; / DEV / нуль & Quot ;. Можете ли вы, пожалуйста, уточнить еще раз. – Maruf 8 August 2015 в 18:25
  • 3
    @Maruf, это не сработает, эффективность. «Первичный ключ» под которым оптимизируется доступ к файлу или каталогу, быстрый и прямой, угадайте, какой путь ... /dir/dir/file_or_dir. Ваша программа на C должна будет также сканировать файловую систему, а find была оптимизирована в течение последних 40 лет ... все еще --- почему? Если вам нужен ярлык, используйте a="/my/really/strange and long/dir path name/", а затем cd "$a". Не могу победить. Или используйте символические ссылки. – Rmano 8 August 2015 в 18:26
  • 4
    Хороший +1. Я был на грани написания чего-то подобного, но я был слишком ленив, так как задача не имеет никакого смысла. @Rmano – Pilot6 8 August 2015 в 18:32
  • 5
    @Rmano Я бы добавил, что в целом даже в одной файловой системе может быть несколько файлов, имеющих один и тот же индекс, т. Е. Hardlinks. Поскольку мы говорим о каталогах здесь, это правда, что каждый каталог имеет уникальный индекс (каталоги не могут быть жестко привязаны.) Кроме того, я думаю, причина, по которой невозможно напрямую получить доступ к файлу с помощью своего inode, заключается в том, что это обойдет любую директорию обход, необходимый для определения того, разрешен ли пользователю доступ к соответствующему ресурсу. (Так что, если к каталогу может быть доступ к его inode, тогда ядро ​​должно было бы определить его путь в любом случае.) – Malte Skoruppa 11 August 2015 в 03:05

Вы можете сделать Tab поворотными папками вместо их перечисления. Отредактируйте файл ~/.inputrc и добавьте

"\C-i": menu-complete
"\e[Z": "\e-1\C-i"

. Если вы хотите его для всех пользователей, отредактируйте /etc/inputrc.

Нажмите Tab + x и Ctrl + r, чтобы сделать его эффективным.

Теперь используйте cd x для перехода к вашей папке без записи ее имени. cd Shift + Ctrl будет вращаться в другом направлении.

Стоит помнить, что cd - перенесет вас в последнюю посещенную папку.

7
ответ дан 23 May 2018 в 18:23
  • 1
    Это хороший ответ. Можете ли вы сделать это один раз, а затем повернуть? – daltonfury42 12 August 2015 в 12:54
  • 2
    Вы можете назначить это другому ярлыку. Я использую Eclipse, и я использую Ctrl + space для автоматического завершения, поэтому я использую " \ C- & quot ;: menu-complete вместо этого, оставляя вкладку как есть. – Katu 13 August 2015 в 01:04

Вы можете использовать подстановочные файлы оболочки.

Например, я могу выполнить

cd a?b?c?d

или

cd a\*b\*c\*d

И он расширит подстановочные знаки до фактическое имя и изменение в этом каталоге. Предположим, что это единственный каталог, который соответствует.

Если у вас есть a b c d и a1b2c3d, тогда cd a?b?c?d будет расширяться до cd a1b2c3d a b c d или cd a b c d a1b2c3d (фактический порядок будет зависеть от ядро, файловая система ...), и bash бесшумно переместит вас к первому пути.

С другой стороны, у вас часто нет одинаково названных папок, поэтому чего-то вроде a*d достаточно для расширения что без ввода всех промежуточных символов. Это особенно полезно, когда вы на самом деле не можете ввести его (например, имена находятся в другом скрипте или даже в другой кодировке), и вам в противном случае понадобилось бы восьмеричное кодирование имени файла.

5
ответ дан 23 May 2018 в 18:23

Вы можете найти этот каталог в файловом менеджере, например. nautilus и просто перетащите его на терминал.

Если вы ранее набрали cd в терминале, вы получите команду.

3
ответ дан 23 May 2018 в 18:23
  • 1
    На самом деле я стараюсь делать все с терминала. :). Поэтому не нужно думать о наутилусе. Я думаю, что должна быть процедура доступа к файлу. Поскольку Linux всегда сохраняет уникальный идентификатор для определенного файла. Но я не знаю, как это сделать или это можно сделать на самом деле. – Maruf 8 August 2015 в 17:10
  • 2
    Непонятно, что вы просите. Невозможно изменить каталог, не введя его имя каким-либо образом. – Pilot6 8 August 2015 в 17:12
  • 3
    См. Заявление. Я обновил его. – Maruf 8 August 2015 в 17:21
  • 4
    Или, если это проблема с одним файлом, вы можете добавить псевдоним. – daltonfury42 12 August 2015 в 12:53

Не уверен, что это именно то, о чем вы просите, но zsh имеет некоторые опрятные трюки для доступа к каталогу другими способами, кроме ввода строгого имени каталога; для одного, вы можете ввести часть имени, и он будет расширяться до полного имени каталога, что позволяет использовать очень полезные вещи, например:

Удар TAB ...

1
ответ дан 23 May 2018 в 18:23
Самый простой способ заключается в двойной щелчок на имени каталога (если он виден на экране), затем введите компакт-диск с последующим пробелом и нажмите колесико на мыши, и он будет копировать и вставить имя каталога, у вас есть подсвечен. Нажатие клавиши ввода затем изменится на требуемый каталог.

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

Удачи.

1
ответ дан 23 May 2018 в 18:23

Если это всего лишь один или несколько каталогов, почему бы не использовать псевдонимы в вашем bashrc или каких-либо init-файлах? Например:

alias abc='cd /tmp/"a b c"'

Тогда, когда вы хотите туда попасть, просто введите abc

1
ответ дан 23 May 2018 в 18:23

Другие вопросы по тегам:

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