Используйте находят результат без./

попробуйте:

:g/^\d/,/^\d/-1j

и проигнорируйте сообщение об ошибке E16: Недопустимый диапазон

8
12.04.2013, 14:36
4 ответа

Только необходимо изменить один символ в команде:

find * -type l -name '*.h' -exec ln -s /sourcedir/{} /destinationdir/{} \;
#    ^
10
27.01.2020, 20:10
  • 1
    , но это должно быть отмечено, хотя это, которое это привело бы к сбою, если какой-либо файл называют !, ( или ) или что-либо запускающееся с a - в текущем каталоге. Это также пропустит скрытые файлы и директоров в текущем каталоге. –  Stéphane Chazelas 12.04.2013, 16:07
  • 2
    @StephaneChazelas, Вы правы. Я думал о скрытых файлах и директорах сам, но нашел только один такой файл в 75K .h в моих системах (ubuntu Linux). –  Anthon 12.04.2013, 16:17

Используйте стандартный синтаксис, как:

S=/sourcedir D=/destdir find . -type l -name '*.h' -exec sh -c '
  for i do
    ln -s -- "$S${i#.}" "$D/$i"
  done' sh {} +

Если Вы хотите использовать GNUisms, Вы могли бы сделать:

find . -type l -name '*.h' -printf '/sourcedir/%P\0/destdir/%P\0' |
  xargs -r0n2 ln -s

Или если /sourcedir текущий каталог:

find "$PWD" -type l -name '*.h' -printf '%p\0/destdir/%P\0' |
  xargs -r0n2 ln -s
6
27.01.2020, 20:10

find распечатает имена относительно путей, которые Вы обеспечиваете как аргументы. В этом случае путь ., таким образом, все имена начнутся ./. Для получения полных путей необходимо обеспечить полный путь, как введено:

find "$PWD" -type l -name '*.h'

Эта команда использует $PWD переменная среды, которая содержит полный путь текущего рабочего каталога, таким образом, это должно сохранить значение Вашей исходной команды.

0
27.01.2020, 20:10
  • 1
    Он должен был бы затем разделить это $PWD от места назначения ln команда. положительная сторона –  Stéphane Chazelas 12.04.2013, 14:44
  • 2
    . Также я думаю, что отвечал на вопрос, который он не задавал. :( –  bonsaiviking 12.04.2013, 14:45
find. -type l -name '*.h' -print0 | cut -z -c3- \
    | xargs -0 -I '{}' ln -s '/sourcedir/{}' '/destinationdir/{}'

man find

  • -print0вывести полное имя файла на стандартный вывод, за которым следует nullперсонаж.

man cut-удалить разделы из каждой строки файлов

  • -zразделитель строк NUL, а не новая строка.
  • -cвыберите только эти символы.
  • N-от N-го байта, символа или поля, считая от 1, до конца строки.

man xargs-создавать и выполнять командные строки из стандартного ввода.

  • xargs [options] [command [initial-arguments]]
  • -0Элементы ввода заканчиваются символом nullвместо пробела, а кавычки и обратная косая черта не специальные (берется каждый символ буквально ).
  • -I replace-strЗамените вхождения replace-strв initial-argumentsна имена считываются со стандартного ввода. Кроме того, пробелы без кавычек не заканчиваются входные элементы; вместо этого разделителем является символ новой строки. Подразумевается -L 1.
  • -L max-linesИспользуйте не более max-linesнепустых строк ввода на командную строку.
0
01.04.2021, 18:54

Теги

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