Как подставить строку в {} в "find (...) -exec (...) {} \;"команда bash? - PullRequest
0 голосов
/ 18 мая 2018

Как я могу заменить строку в {}, найденную bash's ´find´?

Например, я бы хотел ? ниже заменить «in» на «out»:

find . -name "*.in" -exec python somescript.py {} ? \;

т.е. для выполнения для всех файлов "* .in"

python somescript.py somefile.in somefile.out

Ответы [ 3 ]

0 голосов
/ 18 мая 2018

find не имеет функции замены.Вам нужно вызвать оболочку.

find . -name "*.in" -exec sh -c 'python somescript.py "$0" "${0%.in}.out"' {} \;

$0 - это имя файла, ${0%.in} удаляет суффикс .in.

В качестве альтернативы, в bash (но не в обычном sh), запустите shopt -s globstar, чтобы включить рекурсивное расширение каталога (и shopt -s nullglob, если есть риск, что не будет никакого соответствующего файла .in), и используйте цикл for вместо find.

for x in **/*.in; do
  python somescript.py "$x" "${x%.in}.out"
done
0 голосов
/ 18 мая 2018

Использование Brace Expansion:

find . -name "*.in" -exec bash -c 'python script.py "${0%.*}"{.in,.out}' {} \;

Использование Shell Parameter Expansion:

find . -name "*.in" -exec bash -c 'python script.py "${0} ${0/.in/.out}"' {} \;

Результат :

python script.py somefile.in somefile.out
0 голосов
/ 18 мая 2018

Используйте команду bash -c с командой find:

find -name "*.in" -exec bash -c 'python somescript.py "$1" "$(dirname "$1")/$(basename "$1" .in).out"' _ {} \;

Найденное имя файла {} присваивается bash в качестве аргумента $1.

Команда basename удаляет расширение, dirname сохраняет путь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...