Передающие аргументы от одной команды в следующее

Попробуйте это решение. Работавший для меня:

sed -i 's/\$\$file_name.*/&V1/' foobar

где foobar Ваш входной файл.

4
14.08.2014, 13:52
3 ответа

Для этого предикат -exec:

find /some/path -type f -name file.pl -size +10M -exec perl /my/script.pl {} \;

Если вы хотите, чтобы ваша оболочка выполняла команды, основанные на выводе find, то это должно быть bash/zsh специфично, если вы хотите быть надежным, как в:

  • zsh:

    IFS=$'\0'.
    для f ($(найти /some/path -тип f -name file.pl -size +10M -print0)) {
     /my/script.pl $f
    }
    

    , хотя в zsh можно просто сделать:

    для f (./**/file.pl(.LM+10)). /my/script.pl $f
    
  • bash/zsh

    while IFS= read -rd '' -u3 file; do
     /my/script.pl "$файл"
    сделано 3< <(find /some/path -type f -name file.pl -size +10M -print0)
    

Что бы вы ни делали, в bash или других оболочках POSIX, избегайте:

for file in $(find...)

Или, по крайней мере, сделайте это менее плохо, исправив разделитель полей с новой строкой и отключив глобус:

IFS='
'; set -f; for file in $(find...)

(который все равно не будет работать для путей файлов, содержащих символы новой строки).

.
5
27.01.2020, 20:54

Если вы пользуетесь инструментами GNU, должно также работать следующее:

find /some/path -type f -name file.pl -size +10M -print0 | xargs -0 -n 1 -r perl /my/script.pl

Объяснение:

  • Опция -print0 заставляет GNU отделять имена файлов с помощью \0 байтов. Поскольку \0 байты не могут быть частью имени файла, это уникально разделяет имена файлов.
  • Опция -0 указывает GNU xargs читать стандартный входной сигнал как \0-раздельный список имен файлов.
  • Опция -n 1 заставляет передавать вашему сценарию не более одного имени файла (если ваш сценарий может обрабатывать полный список файлов в качестве аргумента, просто пропустите это).
  • Наконец, -r - это другое расширение GNU, которое не позволяет запускать вашу программу, если не предоставляются имена файлов.
3
27.01.2020, 20:54

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

for path in `find /some/path -type f -name file.pl -size +10M`; do perl /my/script.pl $path ;done
-3
27.01.2020, 20:54

Теги

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