Как я могу игнорировать пробелы при использовании sedfile для внесения рекурсивных изменений в каталог?

#linux #sed #find

Вопрос:

У меня есть каталог, состоящий из 102 подкаталогов с 1590 файлами. Я попытался выполнить приведенную ниже команду рекурсивно для всех файлов, включая файлы с пробелами в имени, чтобы изменить список из 400 тегов с #tag на [[link]].

 find . -name '*.md' | xargs sed -i -f sedfile *.md  

Он работает только для файлов, в именах которых нет пробелов. Файл sedfile отформатирован как s/#tag/[[link]]/g

 sed: can't read ./4.Programming/G-Code/List: No such file or directory sed: can't read of: No such file or directory sed: can't read Common: No such file or directory sed: can't read G-Code: No such file or directory sed: can't read Commands: No such file or directory sed: can't read and: No such file or directory sed: can't read What: No such file or directory sed: can't read They: No such file or directory sed: can't read Mean.md: No such file or directory  

Имя файла 4.Программирование/G-Код/Список распространенных команд G-кода и что они Mean.md.

Я ранее использовал

 find . -type f -name "*.md" -print0 | xargs -0 sed -i '' -e 's/#tag/[[link]]/g'  

чтобы внести изменения по отдельности, но я не собираюсь вручную изменять 390 больше.

Когда я пытаюсь объединить эти два

 find . -name '*.md' print0 | xargs -0 sed -i -f sedfile *.md  

Я получаю

 find: paths must precede expression: `print0`  

Статьи, которые я нашел до сих пор в своем исследовании, показывают, как внести несколько изменений в один файл или одно изменение в несколько файлов. Как я могу отредактировать любой из двух примеров, чтобы охватить файлы *.md в каталоге?

Ответ №1:

Есть опечатка: вы используете print0 вместо -print0 .

Вам также не нужно *.md , потому xargs что это предоставление имен файлов.

Это должно сработать:

 find . -name '*.md' -print0 | xargs -0 sed -i -f sedfile  

Вы также можете использовать -exec вместо этого:

 find . -name '*.md' -exec sed -i -f sedfile {}