tail -f, Определите, не записывается ли файл в [closed]

Если вы не знаете, что делает эта команда sed , вы хотите запускать по одному sed для каждого входного файла.
Вы можете сделать это с помощью цикла for (если ваша оболочка поддерживает рекурсивное подстановку), например zsh , ksh93 , yash , bash ( tcsh и fish также, но синтаксис цикла там другой).

shopt -s globstar        # bash
#set -o globstar         # ksh93
#set -o extended-glob    # yash

for f in **/file.txt; do [ -f "$f" ] && sed 'cmd' "$f"; done

или (как указывали другие люди) с find :

find . -type f -name 'file.txt' -exec sed 'cmd' {} \;

Теперь можно задаться вопросом - почему бы не «оптимизировать» это и не использовать find s - exec с + или zsh -изм вроде:

sed 'cmd' **/file.txt(.)

Конечно, это будет более эффективно, поскольку они вызывают sed с несколькими файл операндов, но , что вполне может стать проблемой:
для простоты представьте, что вы пытаетесь распечатать только 1-ю строку каждого файла, используя sed команда 1q 1 (без редактирования файла на месте 2 , возможно, для перенаправления объединенного вывода в другой файл или просто для его проверки), чтобы вы будет выполняться либо

find . -name 'file.txt' -exec sed '1q' {} +

, либо

sed '1q' **/file.txt(.)

, однако оба они не будут доставлены, потому что
, если указано несколько файловых операндов, названные файлы должны быть прочитаны в указанном порядке, а объединение должно быть отредактировано
и как результат sed распечатает только первую строку е ввода не 1-я строка каждого файла 3 .
Теперь gnu sed имеет переключатель -s :

-s, --separate
        consider files as separate rather than as a single continuous long stream

, который иногда может пригодиться, но в данном конкретном случае ( 1q ), это не поможет.


1: если вам не нравится 1q , попробуйте $ d , который должен удалить последнюю строку из каждого файла
2: вам может сойти с рук gnu sed иногда как -i подразумевает -s , но определенно не тогда, когда одна из команд sed - q
3: you мог бы возразить, что это потому, что q завершает работу - но то же самое произойдет, если вы использовали sed -n '1p' - я использовал только q , чтобы выделить 2:

6
27.04.2014, 02:26
0 ответов

Теги

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