Как мне запретить sed уничтожать жесткие ссылки?

Вы можете получить отчет о том, какие файлы отправлены в perl, используя -print и -exec:

find .  -name "*.txt" -print -exec perl -pi  -e 's/http//g' '{}' \;

Если вы хотите узнать, какие файлы были изменены, то что-то вроде

find .  -name "*.txt" \
    -exec perl -i.bak -pe 's/http//g' '{}' \; \
    -exec sh -c 'cmp -s "$1" "$1.bak" && echo "$1" || rm "$1.bak"' _ '{}' \;
5
13.04.2017, 15:37
2 ответа

Обратите внимание, что sed является S tream ED itor, а не редактором файла , поэтому люди склонны злоупотреблять им для пытаюсь редактировать файлы. В основном опция -i - это нестандартные расширения FreeBSD (могут быть недоступны в других операционных системах), во-вторых, он не редактирует файлы - он делает копию и заменяет исходный файл копией. BashFAQ

Альтернативой является использование команды ed или ex (часть Vim) с аналогичным синтаксисом, например

ex +%s/cat/dog/e -scwq pet_link

Или в соответствии с рекомендацией @Wildcard :

printf '%s\n' '%s/cat/dog/' x | ex pet_link

Для нескольких файлов вы можете использовать:

ex "+bufdo! %s/foo/bar/ge" -scxa **/*.lnk

Если ваша оболочка поддерживает новую опцию подстановки (включить: ] shopt -s globstar ), используя ** в этом случае будет работать рекурсивно.


Чтобы узнать больше о синтаксисе POSIX , вы можете попробовать (согласно предложению @Wildcard ):

for f in *.txt; do printf '%s\n' '%s/cat/dog/g' x | ex "$f"; done

или:

find . -type f -exec sh -c 'for f; do printf "%s\n" "%s/cat/dog/g" x | ex "$f"; done' sh {} +

По теме:

2
27.01.2020, 20:33

Немного ed:

$ ed pet_link <<END_OF_ED
g/cat/s//dog/
w
END_OF_ED

Жесткая ссылка не нарушается.

0
27.01.2020, 20:33

Теги

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