bash: вызов функции с аргументами - PullRequest
0 голосов
/ 21 февраля 2020

У меня это работает:

$ find . -name 'copy_*.txt' |while read i ; do echo $i; git mv $i ${i%.txt}.cob ;done

Мне нужно иметь основное тело в функции bash:

$ my_mv () { echo $1; mv $1 ${1%.cob}.toto; } 

Чтобы затем вызвать его с помощью:

$ find . -name 'copy_*.txt' |while read i ;do my_mv $i; done

Но я получаю тихое исполнение и ничего не добавляю:

$ my_mv () { echo $1; mv $1 ${1%.cob}.toto; }
$ find . -name 'copy_*.txt' |while read i ;do my_mv $i; done
$ 

то же самое с:

$ my_mv () { printf '%s\n' $1; mv $1 ${1%.cob}.toto; }

1 Ответ

1 голос
/ 21 февраля 2020

Как сказано в комментариях, это не работает, потому что вы ищете файлы copy_*.txt и пытаетесь переместить файлы с суффиксом .cob. Кроме того, ваши переменные не заключены в кавычки и будут вызывать проблемы с пробелами в именах файлов.

Экспортируйте вашу функцию, чтобы сделать my_mv доступной в find и использовать -exec, чтобы предотвратить проблемы с именами файлов, содержащими символы новой строки:

my_mv () { for i; do echo "$i"; mv "$i" "${i%.cob}.toto"; done; } 
export -f my_mv
find . -name 'copy_*.cob' -exec bash -c 'my_mv "$@"' bash {} +

Часто проще использовать небольшой сценарий оболочки вместо функции:

find . -name 'copy_*.cob' -exec sh -c '
  for i; do
    echo "$i"
    mv "$i" "${i%.cob}.toto"
  done
' sh {} +

Или переместить код в сценарий оболочки mymv.sh

#!/bin/sh

for i; do
  echo "$i"
  mv "$i" "${i%.cob}.toto"
done

и выполнить скрипт в find:

find . -name 'copy_*.cob' -exec ./mymv.sh {} +
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...