Команда для получения текущих установленных версий тех, которые перечислены с помощью «>=» в файле требований (PIP )с помощью grep/xargs

xargs -d "\n" -I {} rm \"{}\"

Предполагается, что версия xargsGNU coreutils поддерживает параметр -dдля указания разделителя.

Это не будет работать вместе с вашей командой find, поскольку она добавляет двойные кавычки к путям, найденным с помощью find. Это означает, что вместо ./somedir/file.scalaвызов rmвыполняется с литеральным путем "./somedir/file.scala".

Пример:

$ touch hello
$ touch '"hello"'
$ ls
"hello" hello
$ echo hello | xargs -d "\n" -I {} rm \"{}\"
$ ls
hello

Это работает, когда вы передаете сгенерированные команды в bash, потому что bashудаляет кавычки.

Это, вероятно, также сработало бы, если бы вы не прилагали дополнительных усилий, чтобы добавить кавычки в первую очередь:

xargs -d "\n" -I {} rm {}

Чтобы правильно удалить файлы, используйте

find. -type f -name '*.scala' -delete

или, если вы все еще хотите использоватьxargs:

find. -type f -name '*.scala' -print0 | xargs -0 rm

, который передает пути между findи xargsв виде списка с нулевыми разделителями -. Nul(\0)— это единственный символ , который не разрешен в имени пути в системах Unix. Имена файлов также не могут содержать /, но допускаются символы новой строки.

Третьим вариантом может быть вызов rmнепосредственно из find:

.
find. -type f -name '*.scala' -exec rm {} +

Обратите внимание, что {}не обязательно должно быть (и не должно быть )в кавычках, так как findпрекрасно знает, как передавать пути с пробелами (, переводами строк или чем-то еще )к названной утилите.

0
21.12.2020, 15:43
1 ответ

Вы можете сделать что-то вроде:

python -m pip freeze |
  awk '!x              {v[$1] = $2; next}
       NF>1 && $1 in v {$0 = $1"=="v[$1]}
                       {print}
      ' FS='==' - x=1 FS='>=' requirements.txt
2
18.03.2021, 22:41

Теги

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