Найдите определенный файл и перейдите в его каталог

(Спасибо за множество ответов на мой вопрос. После некоторого поиска в Интернете я хочу поделиться своим пониманием.)

Согласно здесь :

В Unix-подобных операционных системах файл устройства или специальный файл представляет собой интерфейс для драйвера устройства , который появляется в файловой системе, как если бы это был обычный файл.

Согласно здесь :

Команда mount служит для присоединения файловой системы , найденной на каком-то устройстве , к большому файловому дереву.

Итак, я думаю, что здесь есть 2 разных уровня абстракции программного обеспечения:

  • / dev / cdrom - это специальный файл устройства. Он абстрагируется от оборудования CD-ROM как блочного устройства ввода-вывода. Эта абстракция предоставляется драйвером устройства.

  • / media / cdrom - точка монтирования файловой системы. Таким образом, он обеспечивает более высокий уровень абстракции оборудования CD-ROM, то есть файловой системы. Например, файловая система ISO-9660 . И эта абстракция обеспечивается драйвером файловой системы.

Итак, по сути, 2 разных местоположения файлов для 2 разных уровней абстракции. И в разных сценариях нам может понадобиться другой. Я думаю, что другие ОС, такие как Windows, также предоставляют такие разные возможности, только Linux объединяет их в единую файловую иерархию.

(Думаю, мне стоит поэкспериментировать, написав код на C в Linux для взаимодействия с / dev / cdrom и / media / cdrom . И посмотрите, как все пройдет дальше.)

(Я буду продолжать учиться и при необходимости уточнять свое понимание.)

4
28.08.2017, 18:20
2 ответа
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"
2
27.01.2020, 20:49

Две части :Поиск файла и переход в каталог найденного файла.

Поиск файла

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

  1. Используйте find.
  2. Используйте 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, то совпадения могут также содержать имена вещей, которые не являются обычными файлами (, например. каталоги ).

6
27.01.2020, 20:49

Теги

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