Я использовал ln
для написания символических ссылок в течение многих лет, но я все еще неправильно понимаю порядок параметров.
Это обычно заставляет меня писать:
ln -s a b
а затем глядя на выходной, чтобы напомнить себе.
Я всегда представляю, a -> b
как я это читаю, когда на самом деле все наоборот b -> a
. Это кажется нелогичным, поэтому я нахожу, что я всегда переоцениваю себя.
У кого-нибудь есть советы, которые помогут мне вспомнить правильный порядок?
a
и называете этоb
»ln source target
, То же самоеcp source target
,mv source target
; ...Ответы:
Я использую следующее:
ln
имеет форму с одним аргументом (2-ую форму, указанную на странице руководства ), в которой требуется только цель (потому чтоln
вообще может работать, не зная цели), иln
создает ссылку в текущем каталоге. Форма с двумя аргументами является дополнением к форме с одним аргументом, поэтому цель всегда является первым аргументом.источник
ln
.-t
), выглядит почти как доказательство.ln
msgstr " создает ссылку в текущем каталоге. Форма с двумя аргументами является дополнением к форме с одним аргументом, и поэтому цель всегда является первым аргументом". Поскольку имеет смысл, что это будет иметь место при рассмотрении второй формы, я думаю, что это поможет мне вспомнить.Я иду по принципу «
ln
это какcp
. Источник должен быть на первом месте».источник
mv
.mv
,cp
Иln
все взять существующий файл в качестве первого аргумента, и предполагаемый конечный файл или имя каталога в качестве второго аргумента.memcpy
иstrcpy
т. Д. Работают наоборот.memcpy(dest,src,n);
карт очень хорошоdest = src;
. Другими словами, установите (первыеn
байты) dest равными (первыеn
байты) src.Большинство Unices документируют
ln
команду как(Я опускаю варианты и т.д. здесь)
Примеры:
Стандарт POSIX
OpenBSD :
NetBSD и FreeBSD
Macos
Solaris
AIX
Руководство GNU
ln
вызываетsource
цель иtarget
имя ссылки .Руководство по GNU для
ln
Игнорируя выбор слов в GNU,
ln
утилита использует семантику того же рода, что и, например,mv
иcp
в том, что целью является то, что создано из источника .Следовательно,
создаст символическую ссылку,
b
указывающую наa
.Также обратите внимание, что при создании символических ссылок источником является просто строка, представляющая, на что должна указывать символическая ссылка. Обычно не делается проверка, чтобы убедиться, что она указывает на что-нибудь полезное:
источник
ln -s a b
работает, и это не имеет ничего общего с формулировкой GNU, поскольку я не думаю, что когда-либо смотрел на фразы на странице руководства. : D (легче просто бежать,ln -si a b
когда не уверен, он будет жаловаться, еслиb
уже существует.)В случае , если это помогает любому: я привык думать о нем , как «ЛУ , что где », который помогает мне вспомнить , что первый аргумент ( «что») является существующий файл, то второй ( «где») место поставить (ссылку на) это. В отличие от рассуждений в большинстве других ответов, это не более чем содержательная фраза, которую я могу мысленно процитировать себе, когда набираю команду, которая служит памятью. Это, вероятно, не будет полезным для всех, но я подозреваю, что это поможет некоторым людям.
Помогает, что другие стандартные команды управления файлами используют то же соглашение, поэтому я могу сделать то же самое для
cp
иmv
.источник
Недавно я услышал отличный способ запомнить эту конкретную вещь: рифма
Первый стих - это аргументы ln: что-то старое, за которым следует имя новой записи каталога.
источник
С 1971 г. Руководство по изданию Unix First Edition .
Существует вторая простая синтаксическая форма.
Изменить: Я ставлю FILE или FILENAME вместо TARGET --- видеть комментарии и т.д. Смотри также очень долго добавление в нижней части, обращаясь к айсберг, твердые и мягкие из
ln
, а не только кончик его.Итак, GNU
ln
имеет это:где вам не нужно имя ссылки. После
ln -s /usr/lib/modules
того, как вы получитес тем же именем, что и FILENAME («цель» или «источник»), прямо там, где вы находитесь. Нет выбора, нет путаницы.
Теперь, если вы более требовательны и хотите, чтобы ссылка была создана под другим именем и / или где-то еще , вы добавляете это желание в качестве имени или пути. На первом месте настоящая цель, второе - дополнительная фантастическая новая ссылка.
Или вы говорите: «Я знаю это обозначение стрелки
ls -l
для ссылок. У меня нет стрелки в оболочке, чтобы показать направление моей ссылки. Поэтому я должен перевернуть ее».Вы создаете это в одном направлении, так что вы можете использовать его в другом.
(КОНЕЦ ЧАСТИ ОТВЕТА)
На другом уровне само слово «ссылка» несет глубокое скрытое двойное значение. Символические ссылки появились позже, поэтому в первые дни ссылка была просто ссылкой. Не было мягкого и жесткого, без
-s
вариантов. И теперь я даже использую символику источника-цели:На этом этапе есть ссылки, но не жесткие и мягкие, и
ls -l
стрелки не отображаются, поскольку в (жесткой) ссылке нет направления. «Ссылка» на этом этапе эволюции Unix означала, что имя файла «B» (запись каталога «B») в файловой системе указывает на тот же индекс, на который указывает имя файла «A».Файлы A и B «связаны» вместе, потому что они используют одни и те же блоки. Итак, теперь с каждым rm ядро должно проверять: удалить / освободить блоки этого файла на диске или есть другой файл, связанный с теми же блоками? Для этого используется счетчик ссылок.
Скажем, вы хотите сохранить большой файл на / tmp grom и удалить
ln /tmp/bigfile
. Теперь у вас есть большой файл в вашем рабочем каталоге. После очистки / tmp и удаления «оригинала» вы успешно продолжаете использовать одни и те же блоки данных. Вы не получаете мертвую или висящую ссылку, у вас есть нормальный файл. Указывает не на файл, а только на блоки файловой системы, как это делает каждая запись в каталоге. Только теперь «чистка» / tmp уже не так эффективна, как была. Это выглядит пустым, и это так, но блоки в разделе не освобождаются.Несмотря на то, что жесткая ссылка сама по себе не стоит места, как это делает cp, косвенно, она может.
Добавление
ln -s
к последовательности выше:Теперь "B", мягкая ссылка, содержит только строку с путем. Это "мягкая" информация. Технически «А» и «В» не связаны. Но все же B является «ссылкой» в новом смысле, что вы можете использовать это сохраненное имя пути в качестве ярлыка для «A». Теперь это «ссылка на A» (точка), а не «связанная с inode файла A»
Оба вида ссылок могут запутать не только людей, но и ядро / фс. Страница руководства 1971 года отмечает: «ОШИБКИ: ссылки дублируются дважды и восстанавливаются как отдельные файлы с отдельными inode».
Жесткие ссылки на каталоги (редко / недопустимо) могут легко привести к засорению.
Мягкие ссылки на каталоги (очень распространенные) могут привести к вечным циклам - должны распознаваться утилитами / ядром.
Практический пример в bash
Начиная с обычного файла "F" ...
... делает Fhard того же размера, что и F, но они ОБА теперь появляются в темно-красных БЕЗ стрелок
ls -l --color
. Из-заstat
отображения «Ссылки: 2» в связи с «Inode: XYZ». Жесткая ссылка F превращает F в жесткую ссылку. Оба являются / stay filetype "обычный файл". Но у обоих есть индекс с числом ссылок выше 1.... делает крошечный "нерегулярный" файл "Fsoft" с типом файла "символическая ссылка" - еще больше экономит место, чем пустой каталог. А не
ls -l
показывает ничего особенного для "F". Для Fsoft показанный размер составляет 1 байт, так как строка равна «F» иFsoft -> F
отображается как имя. Нет необходимости раскрашивать мягкую ссылку, чтобы ее распознать. Потому что в краткой формеls -F
вы@
добавляете спиральную цепочку :Fsoft@
С
ls -l
этим выглядит так:У Фхарда размер и тип Ф.
Fsoft имеет имя F и длину имени F в качестве размера, а также другой тип файла.
Коротко
ls -sF
:добавление
--block-size=1
также не дает одинаковых размеров. Fsoft имеет размер "один байт, ноль блоков". F и Fhard отклоняются параллельно:Чтобы увидеть, болтается ли Fsoft или нет,
ls
позволяет использовать цвета.источник
Очень полезно помнить, что название ссылки не является обязательным. Если оно не задано, используется базовое имя цели ссылки.
идентично удалению имени ссылки полностью:
Это не имеет никакого смысла, если цель ссылки была упомянута последней.
источник
Просто подумайте, Unix -> AT & T -> пункт назначения справа:
источник
ln abc def
,abc
иdef
в тот же объект; они неразличимы. Более того, операция не оказывает никакого влиянияabc
, кроме увеличения количества ссылок. Назначенияdef
. Указатель на объект вновь установлен вdef
локации.ln -s abc def
означает, что содержимоеabc
записывается в местоположениеdef
.abc
даже не нужно ничего решать; это может быть свисающая связь.mv dest src
,ln [ -s ] dest src
,cp dest src
, ...Лично я предпочитаю избегать запоминания X, чтобы знать, где искать X, когда мне это нужно. Я также являюсь поклонником отношения «лучше безопасно, чем сожалеть», поэтому мне всегда нравится тщательно проверять, что я пишу, особенно как root.
В этом случае ответ буквально в первых строках справочной страницы:
Я бы не предложил этого, если бы потребовалось углубиться в man-страницу, но, поскольку это в самом начале, ИМХО, это стоит 3 секунд, которые требуются для ввода
man ln
и выхода.источник
Подобно cp, который я мысленно читаю как «скопировать это в то», я читаю ln команды как «связать это с этим».
источник
Вот как я это помню: Забудь цель. Другими словами, если я нахожусь в dir1 и хочу создать здесь символическую ссылку на file1, которая существует в / some / other / dir /, я бы просто сделал:
Вы получите символическую ссылку с именем file1 в dir1, которая указывает на / some / other / dir / file1. Со страницы руководства для ln:
Просто имейте в виду, что это работает, только если вы хотите, чтобы символическая ссылка имела то же имя, что и цель (что, скорее всего, имеет место).
источник
Я хотел бы расширить ответ @ Гэри.
В дополнение к его ответу:
ln
команда может принимать произвольное количество аргументов, так что вы можете создать несколько символических ссылок за один вызов (что удобно, когда вам это нужно).ln -s foo bar baz
, каково самое логичное объяснение, какие аргументы означают что?ln -s foo bar
, каково наиболее логичное объяснение того, что аргументы означают что?источник
Представьте себе версию,
ln
которая позволила вам создать несколько (символических) ссылок в одной команде.С тех пор это не изменится, так как символическая ссылка может указывать только на одну
TARGET
за раз, и обычное соглашение командной строки - поместить повторяющуюся часть в конец командной строки, напримерgrep PAT [FILE]...
источник
"
ls
показываетa -> b
такln a b
"Просто помните, что это неправильно.
источник
ls -l
:link -> target
может запутать ваше представление о том, как настроитьln
командную строку. Но я боюсь, что это не сильно поможет.