O erro parece indicar que o sed tenta ler stdin . Você já tentou apenas a parte find para ver se ela retorna algum arquivo?
Estou tentando executar um comando para remover require_once
dos arquivos php de aqui (código abaixo), mas estou recebendo o erro:
sed: can't read -: No such file or directory
Estou na pasta correta; qual é o problema?
find . -name '*.php' -not -wholename '*/Loader/Autoloader.php' \
-not -wholename '*/Application.php' -print0 | \
xargs -0 sed --regexp-extended --in-place 's/(require_once)/\/\/ /g'
Atualização:
Se eu correr:
find . -name '*.php' -not -wholename '*/Loader/Autoloader.php' \
-not -wholename '*/Application.php' -print0
Eu recebo:
find: invalid predicate '-wholename'
Eu tentei isso e ele retornou uma lista de todos os arquivos:
find . -name '*.php' -not -name '*/Loader/Autoloader.php' \
-not -name '*/Application.php' -print0
Mas alterando o original para refletir isso:
find . -name '*.php' -not -name '*/Loader/Autoloader.php' \
-not -name '*/Application.php' -print0 | \ xargs -0 sed --regexp-extended --in-place 's/(require_once)/\/\/ /g'
Dá o erro:
-bash: xargs: command not found
FYI, estou executando a versão 4.1.2 do sed e já estou um pouco perdido na linha de comando, então, por favor, explique as respostas
O erro parece indicar que o sed tenta ler stdin . Você já tentou apenas a parte find para ver se ela retorna algum arquivo?
Sua segunda invocação não faz sentido, porque o "\" antes do xarsg? Você tenta chamar um programa chamado "xargs", e o bash lhe diz que não pode encontrá-lo (note o espaço em branco duplo após os dois pontos), o que não é surpreendente.
Para se livrar do caso de erro em que o sed trava quando o xargs retorna zero arquivos (porque está tentando ler stdin quando não há argumentos de linha de comando), você deve adicionar -r aos seus argumentos xargs.
Qual versão de sed
você tem? O POSIX sed não entende as opções de duplo traço, nem minised, mas o GNU sed faz.
Para algo mais portátil (e IMO mais agradável), tente sed -i '/require_once/s![[:space:]]*!&// !'
.
Eu prefiro perl -pi.bak para esses tipos de casos.
FMTYEWTK no link
(FMTYEWTK significa Muito Mais do Que Você Queria Saber)
Infelizmente, a página à qual a pergunta está vinculada desapareceu, por isso não posso verificar o comando original. Em vez disso, vou fazer algumas suposições.
O primeiro erro vem da execução do GNU sed
e da edição no local em um arquivo de entrada chamado -
. Este arquivo não existe e você recebe esse erro:
Exemplo (usando um script sed
vazio):
$ sed -i -e '' -
sed: can't read -: No such file or directory
De onde vem o nome do arquivo -
, não sei, mas pode ter algo a ver com a não obtenção de nomes de arquivos de find
(veja abaixo).
Parece que você mudou para outra máquina ou implementação find
, porque agora o comando find
não reconhece mais o teste -wholename
. Esse erro me confunde.
Em seguida, você altera -wholename
para -name
, mas você deve alterá-lo para -path
, pois -wholename
é o mesmo que -path
no GNU find
.
Seu comando find
ainda não funcionará, mesmo se você alterar -wholename
para -path
, pois a expressão usada deve ser uma expressão regular.
Como uma expressão regular, */Application.php
corresponde à string exata */Application.php
. Um *
no início de uma expressão regular corresponde a um literal *
. Você pode ter pretendido usar .*/Application.php
, mas isso seria o mesmo que -name "Application.php"
.
Considerando todos os itens acima, e removendo a chamada xargs
( esse erro vem de escapar do espaço na frente do nome do comando, que então se torna parte do nome real do comando, que não pode ser encontrado):
find . -type f -name '*.php' \
! -path '.*/Loader/Autoloader.php' \
! -name 'Application.php' \
-exec sed -i 's/require_once/\/\/ &/' {} +
Isso também reduz a chamada para o GNU sed
um pouco, para que ele não precise usar expressões regulares estendidas.
Relacionados: