Симлинк - это буквально текстовый файл, который обрабатывается ядром особым образом и содержимое которого является путем к другому файлу/каталогу.
Вы можете прочитать содержимое файла симлинка с помощью readlink
, а если вы стандартно откроете файл симлинка, система откроет файл/каталог, на который ссылается содержимое симлинка.
Если вы знакомы с C/C++, то симлинк в большинстве контекстов ведет себя примерно так же, как ссылка на C++ или указатель с автопереадресацией (не во всех: например, rm
или mv
работают непосредственно с симлинком, а не с целью). Разница в том, что настоящие ссылки C++ связываются с адресами памяти, а симлинки связываются с адресами файловой системы.
Содержимое симлинка не обязательно должно быть корректной ссылкой на путь к файлу --> тогда у вас висячий симлинк (как висячий указатель или висячая ссылка).
Если путь к файлу в симлинке не является абсолютным (начиная с /
), то относительный путь к файлу определяется относительно местоположения симлинка (в контекстах без симлинка относительные пути определяются относительно $PWD
).
Флаг -s
предназначен для "создания symlinks". ln
также может создавать hardlinks.
Жесткие ссылки работают на другом уровне, который ближе к реализации файловой системы (следовательно, вы не можете создавать жесткие ссылки в разных файловых системах).
Файловые системы Unix хранят имена файлов (/имена каталогов) и содержимое файлов (содержимое каталогов) отдельно, а имена - это просто автозависимые указатели на их содержимое. Жесткая ссылка создает другое имя для того же содержимого, увеличивая при этом счетчик ссылок.
$ echo 'the contents' > f1
$ ls -l f1
* 1 * #the 2nd column is the reference count
$ ln f1 f2 #create another name for the contents of f1
$ ls -l f1
* 2 * #the contents of f1 has two named references to it
$ rm f1 #the contents of f1 lives on (in f2) #
# because rm only removes the reference to the data block
#and this isn't the only reference
#(rm ivokes a system call literally named `unlink`)
Вы не можете создавать жесткие ссылки на каталоги, но .
и ...
являются неявно созданными для вас ссылками на каталоги. Следовательно, количество жестких ссылок для каталога отражает количество подкаталогов в нем (каждый подкаталог имеет жесткую ссылку ...
на родительский каталог).
echo 'file data' > fileName
ln fileName fileName2 #hardlink
ln -s "$PWD/fileName" absoluteSymlinkTofileName
ln -s fileName relativeSymlinkTofileName
В одной и той же физической файловой системе ln
создает другое имя для файла data
(ln
не работает в разных файловых системах). Вы можете удалить fileName
или fileName2
, и пока остается хотя бы одно имя, file data
продолжает жить.
absoluteSymlikTofileName
- это автозависимая ссылка на имя fileName
. Пока этот путь разрешается во что-то, симлинк действителен. Если вы удалите цель, симссылка будет висеть. Это абсолютная симссылка, поэтому ее можно перемещать в другие места без изменения ее действительности.
relativeSymlinkToFileName
ссылается на имя fileName
в том же каталоге, что и каталог relativeSymlinkToFileName
. Если вы переместите его в другой каталог, в котором также есть файл (или каталог) с именем fileName
, то он будет указывать на него.
for i in `cat file2|wc -l`
do
j=`cat file1|cut -d, -f4`
m=`cat file2|cut -d, -f5`
file1_dom=`cat file1|cut -d, -f1`
file2_vm=`cat file2|cut -d, -f2`
if [[ `${j} -gt ${m}` ]]
then
echo ${file2_vm} can be reclocated to ${file1_dom}
fi
done
Несколько проблем, которые я вижу в вашем фрагменте кода:
$(cmd)
. cat file2 | wc -l
, например, wc -l file2
короче и эффективнее. (Нет необходимости запускать cat
, передавать его stdout
на wc
и т. д.)${file1_dom}
. Кроме того, нет необходимости писать ${file1_dom}
, было бы предпочтительнее $file1_dom
(синтаксис ${...} предлагает некоторые другие преимущества, которые здесь не нужны ). -eu
в строку интерпретатора (shebang )ваших сценариев. [[
для простых числовых сравнений, достаточно [
. ${j} -gt ${m}
окружено обратными кавычками и, следовательно, выполняется в подоболочке, поэтому значение j
принимается в качестве имени команды. (Вот откуда пришло сообщение. )Вы хотите что-то вроде if [ "$j" -gt "$m" ]; then...
, применяя все вышеперечисленные правила. Если вы решите переписать свой сценарий в соответствии с этими правилами, добавьте его в свой исходный пост, чтобы другие могли извлечь пользу из того, что правильный сценарий имеет значение.