Измените некоторые файлы для добавления имени файла

Это - действительно намеченное поведение. От 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 относительно места это находится в, независимо от того, где то место могло бы быть в дереве каталогов.

2
27.09.2014, 01:28
3 ответа

Стандартный подход - использовать временные файлы, но вы можете изменить файлы на месте, если заключите cat в круглые скобки $ () :

for file in *.txt; do echo "$file"$'\n'"$(cat -- "$file")" > "$file"; done
3
27.01.2020, 21:57

Вы можете использовать стандартный текстовый редактор:

for f in *; do printf '%s\n' 1i "$f" . w q | ed "$f"; done
1
27.01.2020, 21:57
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 также позволяет это. Все зависит от о том, какие еще инструменты у вас есть. :)

1
27.01.2020, 21:57

Теги

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