Это - действительно намеченное поведение. От ln(1)
страница справочника:
Символьные ссылки могут содержать произвольный текст; если позже разрешенный, относительная ссылка интерпретируется относительно ее родительского каталога.
Относительно, почему из него, вообразите, интерпретировалась ли символьная ссылка вместо этого относительно ее источника, а не ее места назначения. Позже разрешив его, необходимо было бы знать то, чем CWD был при создании его который бессмыслен, уже не говоря о невозможном.
Кроме того, этот способ, которым Вы заставляете аккуратный и компактный метод создавать скелетную структуру каталогов, которую можно отбросить где угодно в дереве каталогов, не повреждая символьные ссылки.
Чтобы дать Вам пример того, что я имею в виду, скажем, Вы работаете над проектом, и Вам настраивали целую структуру каталогов для него как так:
$ ls -1 /home/you/project
thingummies/
widgets/
wizardry/
Теперь предположите, что Вы хотели создать символьную ссылку на widgets/
внутри wizardry/
. У Вас есть две опции:
$ ln -s /home/you/project/widgets /home/you/project/wizardry
или
$ ln -s ../widgets /home/you/project/wizardry
Если Вы затем пытаетесь переместиться /home/you/project
где-либо еще символьная ссылка, созданная с первой формой, повредится, потому что она ищет /home/you/project/widgets
. Вторая форма сохранит символьную ссылку функциональной, потому что она ищет ../widgets
относительно места это находится в, независимо от того, где то место могло бы быть в дереве каталогов.
Стандартный подход - использовать временные файлы, но вы можете изменить файлы на месте, если заключите cat
в круглые скобки $ ()
:
for file in *.txt; do echo "$file"$'\n'"$(cat -- "$file")" > "$file"; done
Вы можете использовать стандартный текстовый редактор:
for f in *; do printf '%s\n' 1i "$f" . w q | ed "$f"; done
for file in *; do
(echo "$file"; cat -- "$file") > "$file.new"
mv -- "$file.new" "$file"
done
Это циклы по всем файлам.
перекликается с каждым именем и
добавляет содержимое файла
затем все поместить в новый файл
с дополнительным суффиксом .new
.
Вы создаете новый файл для каждого существующего, так что вы должны переименовать файлы позже.
Вы можете поместить результаты в новую директорию. и затем удалить старую:
mkdir new
for file in *; do
(echo "$file"; cat "$file") > "new/$file"
done
Можно также использовать sed с опцией -i
.
чтобы сделать редактирование файлов на месте.
Perl также позволяет это. Все зависит от
о том, какие еще инструменты у вас есть. :)