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: