Рекурсивное применение функции bash к каждому файлу в подпапке

Проблема здесь:

'-15 minutes "$n"'

Одиночные кавычки останавливают подстановку переменных, поэтому вы буквально передаете «$ n» , а не содержимое переменной.

Напишите:

/opt/bin/date --date "-15 minutes $n" '+%Y-%m-%dT%H:%I:%S'

вместо этого.

4
23.11.2016, 01:34
3 ответа

Есть два способа решить эту проблему: вы можете указать xargs запускать команду только с одним аргументом за раз, используя -n1 или цикл для всех аргументов внутри вашей функции fun :

function fun() { echo $1 }
export -f fun
find tests -type f -print0 | xargs -n1 -0 bash -c 'fun "$@"' --

или

function fun() { while [ -n "$1" ]; do echo $1; shift; done }
export -f fun
find tests -type f -print0 | xargs -0 bash -c 'fun "$@"' --
1
27.01.2020, 20:55

Используйте сценарий оболочки.

Процитирую этот отличный ответ :

Нужно ли, чтобы другие программы, помимо вашей оболочки, могли его использовать? Если да, то это должен быть сценарий.

Как уже отмечалось в других ответах, может быть возможно обойти это путем экспорта функции, но, безусловно, много проще просто использовать скрипт.

#!/bin/bash
# I'm a script named "fun"!  :)
printf '%s\n' "$@"

Затем вы просто помещаете сценарий fun где-нибудь в вашем PATH (возможно, в ~ / bin ), убедитесь, что он исполняемый, и вы можете запустить:

find tests -type f -exec fun {} +
2
27.01.2020, 20:55

Если вы используете GNU Parallel, это будет выглядеть так:

function fun() {
    echo "$@"
}
export -f fun

find tests -type f -print0 | parallel -0 -Xj1 fun
1
27.01.2020, 20:55

Теги

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