(Спасибо за множество ответов на мой вопрос. После некоторого поиска в Интернете я хочу поделиться своим пониманием.)
Согласно здесь :
В Unix-подобных операционных системах файл устройства или специальный файл представляет собой интерфейс для драйвера устройства , который появляется в файловой системе, как если бы это был обычный файл.
Согласно здесь :
Команда mount служит для присоединения файловой системы , найденной на каком-то устройстве , к большому файловому дереву.
Итак, я думаю, что здесь есть 2 разных уровня абстракции программного обеспечения:
/ dev / cdrom
- это специальный файл устройства. Он абстрагируется от оборудования CD-ROM как блочного устройства ввода-вывода. Эта абстракция предоставляется драйвером устройства.
/ media / cdrom
- точка монтирования файловой системы. Таким образом, он обеспечивает более высокий уровень абстракции оборудования CD-ROM, то есть файловой системы. Например, файловая система ISO-9660 . И эта абстракция обеспечивается драйвером файловой системы.
Итак, по сути, 2 разных местоположения файлов для 2 разных уровней абстракции. И в разных сценариях нам может понадобиться другой. Я думаю, что другие ОС, такие как Windows, также предоставляют такие разные возможности, только Linux объединяет их в единую файловую иерархию.
(Думаю, мне стоит поэкспериментировать, написав код на C в Linux для взаимодействия с / dev / cdrom
и / media / cdrom
. И посмотрите, как все пройдет дальше.)
(Я буду продолжать учиться и при необходимости уточнять свое понимание.)
cd "$(find . -name filename -printf %h -quit 2>/dev/null)"
Если файл с таким именем не найден, то cd
переходит в домашний каталог. Если это не нужно, вам нужно что-то вроде этого:
dir="$(find . -name filename -printf %h -quit 2>/dev/null)"
test -d "$dir" && cd "$dir"
Две части :Поиск файла и переход в каталог найденного файла.
Если у вас есть имя файла, который вы хотите найти где-то в файловой иерархии вашей системы, есть два способа, которые сразу приходят на ум:
find
. locate
. Чтобы найти файл с помощьюfind
:
$ find / -type f -name "filename" -print
Это будет бродить по всей файловой системе от корня(/
)вниз и печатать полные пути всех обычных файлов с именем filename
. Измените /
на любой путь к каталогу, из которого вы хотите выполнить поиск.
Для поиска файла с помощьюlocate
:
$ locate -r -b '^filename$'
Это выведет все пути ко всем файлам (и каталогам и т. д. )с именем filename
. Обычно это намного быстрее, чем использование find
. Я использую -r
и регулярное выражение здесь для сопоставления полных имен файлов, в противном случае вы можете получить совпадения, такие как file3
для поиска file
. Опция -b
делает соответствие locate
только «базовому имени» путей, то есть фактическому имени файла в конце каждого пути.
Чтобы иметь возможность использовать locate
на Cygwin, сначала необходимо инициализировать «базу данных locate
». Вы делаете это, запустив
$ updatedb
Недостатком locate
является то, что он знает о расположении файлов только при запуске updatedb
.Вот почему большинство систем Unix с locate
обычно запускаютupdatedb
(или эквивалентную команду )с использованием cron
(, которая, я не думаю, доступна в Cygwin )через регулярные промежутки времени; один раз в день в некоторых Linux или раз в неделю, как по умолчанию в OpenBSD.
Поскольку ни один из этих методов не гарантирует возврата только одного пути к файлу, трудно придумать надежный -способ смены рабочего каталога на каталог найденного файла (. ] если их много, то какой выбрать? ).
Предположим, вы хотите выбрать первый результат:
cd "$( dirname "$(somecommand | head -n 1)" )"
Здесь somecommand
равно find
или locate
, как указано выше.
head -n 1
выберет первый результат из списка, а dirname
извлечет только путь к каталогу, содержащему файл. cd
затем изменит рабочий каталог на этот каталог.
Имейте в виду, что если вы используете locate
, то совпадения могут также содержать имена вещей, которые не являются обычными файлами (, например. каталоги ).