Quero procurar arquivos que contenham terminações de linha dos com grep no Linux. Algo assim:
grep -IUr --color '\r\n' .
O texto acima parece corresponder ao literal, rn
que não é o que é desejado.
A saída disso será canalizada através de xargs em todos para converter crlf em lf assim
grep -IUrl --color '^M' . | xargs -ifile fromdos 'file'
dos2unix
com o-ic
switch. Para arquivos LF, você pode pesquisar com o unix2dos-ic
. Não modifica arquivos. Apenas reporte.cat -v somefile.txt
; eles aparecem como^M
Respostas:
Use Ctrl+ V, Ctrl+ Mpara inserir um caractere literal de retorno de carro em sua string grep. Assim:
funcionará - se
^M
houver um CR literal que você insira como sugeri.Se você deseja a lista de arquivos, também deseja adicionar a
-l
opção.Explicação
-I
ignorar arquivos binários-U
impede que o grep retire caracteres CR. Por padrão, ele faria isso se decidir que é um arquivo de texto.-r
leia todos os arquivos em cada diretório recursivamente.fonte
printf '\r'
grep $(printf '\r')
. Mas para os usos mais práticos que envolvem o bash, eu continuaria$'\r'
.-U
é relevante apenas para Windows (ou cygwin), mas é fundamental aqui. No Windows, o comando não funcionará sem ele.-I
? Pelo manual, parece-me que os arquivos binários são considerados sem correspondência. A combinação de-I
e-U
(que impõe o tipo binário) não deve resultar em todos os arquivos considerados como não correspondentes?grep provavelmente não é a ferramenta que você deseja para isso. Irá imprimir uma linha para cada linha correspondente em cada arquivo. A menos que você queira, digamos, executar todos 10 vezes em um arquivo de 10 linhas, o grep não é a melhor maneira de fazer isso. Usar o find para executar o arquivo em todos os arquivos da árvore e, em seguida, procurar por "CRLF" obterá uma linha de saída para cada arquivo que possui finais de linha com estilo dos:
você terá algo como:
fonte
grep -IUrl --color '^M' . | xargs -ifile fromdos 'file'
file
programa. Isso é muito frágil. Por (apenas um) exemplo: ele não funciona com arquivos XML,file
relatóriosXML document text
independentemente do tipo de nova linha.-m /dev/null
no meufind (GNU findutils) 4.4.2
(Ubuntu 12.04).find . -type f | xargs file | grep CRLF
explicaçãoshell.com - grep -IUlr
fonte
Se sua versão do grep suportar a opção -P (--perl-regexp) , então
poderia ser usado.
fonte
fonte
A consulta foi de pesquisa ... Eu tenho um problema semelhante ... alguém enviou finais de linha mistos no controle de versão, então agora temos um monte de arquivos com
0x0d
0x0d
0x0a
finais de linha. Observe queencontra todas as linhas, enquanto
e
não encontra nenhuma linha, então pode haver algo "mais" acontecendo dentro do grep quando se trata de padrões de final de linha ... infelizmente para mim!
fonte
Você pode usar o comando file no unix. Ele fornece a codificação de caracteres do arquivo junto com os terminadores de linha.
fonte
Se, como eu, seu unix minimalista não inclui detalhes como o comando file , e as barras invertidas em suas expressões grep simplesmente não cooperam, tente o seguinte:
As modificações que você pode querer fazer no item acima incluem:
Por exemplo, algo assim pode funcionar para você usando od em vez de dump :
fonte
dos2unix
possui uma opção de informações do arquivo que pode ser usada para mostrar os arquivos que seriam convertidos:Para fazer isso recursivamente, você pode usar
bash
aglobstar
opção 's' , que para o shell atual é ativada comshopt -s globstar
:Como alternativa, você pode usar
find
para isso:fonte