Назад | Перейти на главную страницу

командная строка Perl, чтобы не стирать ссылки на символы

Я хочу редактировать исходные файлы с помощью perl, когда у меня есть числовая последовательность псевдонимов.

Задача - использовать perl в командной строке, например

 perl -pe 's/apples/oranges/' 

Но для редактирования файлов на месте:

 perl -i.bak

В -i опция не работает с символическими ссылками

 ln -s fs fruitSalad

С участием -i, perl перезапишет новый файл, заменив (уничтожив) предыдущую символьную ссылку. т.е. он не редактирует оригинал.

Есть обходной путь (https://unix.stackexchange.com/questions/9318/is-there-a-way-to-make-perl-i-not-clobber-symlinks) который выглядит так:

 perl -i.bak -pe 's/apples/oranges/' $(readlink fs)

Вот моя проблема. Я хочу редактировать на месте исходные файлы из последовательности символических ссылок.

 ln -s fs.1 fruitSalad-1
 ln -s fs.2 fruitSalad-2

С обычными файлами perl будет работать с диапазонами, например

 perl -i.bak -pe 's/apples/oranges/' fs.{1..2}

Но это не работает с $(readlink __) уловка. Комбинировать вышеперечисленное невозможно, и я предпочитаю избегать xargs.

Есть идеи, как редактировать диапазоны файлов с помощью их символических ссылок из командной строки? Что мне не хватает?

Один из способов - заменить содержимое @ARGV (имена файлов, с которыми выполняются действия) с целью ссылки до цикла по содержимому файла, если этот файл является символической ссылкой.

$ mkdir blah && cd blah
$ echo aa > orig
$ ln -s orig slink
$ perl -i -pe 'BEGIN{@ARGV=map{$_=readlink if -l}@ARGV}; s/aa/bb/' slink
$ readlink slink
orig
$ cat orig
bb
$