xargs -d "\n" -I {} rm \"{}\"
Предполагается, что версия xargs
GNU 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
прекрасно знает, как передавать пути с пробелами (, переводами строк или чем-то еще )к названной утилите.
Вы можете сделать что-то вроде:
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