Eu tenho que converter um diretório inteiro usando dos2unix. Eu não sou capaz de descobrir como fazer isso.
Eu tenho que converter um diretório inteiro usando dos2unix. Eu não sou capaz de descobrir como fazer isso.
Respostas:
find . -type f -print0 | xargs -0 dos2unix
Irá encontrar recursivamente todos os arquivos no diretório atual e solicitar o comando dos2unix desses arquivos
\;; echo Hello
findinvocação não faz essa verificação (embora isso seja simples o suficiente para adicionar), mas o moderno dos2unixignora corretamente os arquivos binários.
Se for um diretório grande, considere executar com vários processadores:
find . -type f -print0 | xargs -0 -n 1 -P 4 dos2unix
Isso passará 1 arquivo por vez e usará 4 processadores.
npor uma ordem de magnitude ou dois (dependendo de quantos arquivos que estamos falando aqui)
Como fiquei satisfeito com o dos2unix, estendi meu próprio utilitário simples. Além de algumas vantagens em velocidade e previsibilidade, a sintaxe também é um pouco mais simples:
endlines unix *
E se você quiser que ele desça em subdiretórios (pulando diretórios ocultos e arquivos não textuais):
endlines unix -r .
endlinesestá disponível aqui https://github.com/mdolidon/endlines
dos2unix? Genuinamente curioso.
dos2unix, com recursos variados (alguns leem UTF32, por exemplo, enquanto outros não; as linhas finais não). Há apenas um endlines, cujos recursos são bem conhecidos. 2 / liberal na entrada, nem todos dos2unixsão. 3 / exploração eficiente da árvore de arquivos, projetada para ser rápida e prática em dezenas de milhares de arquivos. 4 / sai da caixa no OSX - o que é menos importante agora que o pacote Brew existe.
Provavelmente, é melhor pular arquivos e pastas ocultos, como .git.Então, em vez de usar find, se sua bashversão é recente o suficiente ou se você estiver usando zsh, basta:
dos2unix **
Observe que, para o Bash, isso exigirá:
shopt -s globstar
.... mas esse é um recurso útil o suficiente para você honestamente colocá-lo de .bashrcqualquer maneira.
Se você não quiser pular arquivos e pastas ocultos, mas ainda não quiser mexer find(e eu não o culpo), você pode fornecer um segundo argumento de recursive-glob para corresponder apenas às entradas ocultas:
dos2unix ** **/.*
Observe que, em ambos os casos, o glob se expandirá para incluir diretórios; portanto, você verá o seguinte aviso (possivelmente várias vezes): Skipping <dir>, not a regular file.
dos2unixalias que afeta a maneira como os argumentos são expandidos. Qual é a saída do type dos2unixseu sistema?
**vez de, findé "pular arquivos e pastas ocultos, como .git". dos2unixnunca vê os arquivos ocultos, porque **não se expande para mostrá-los. Se você deseja executar automaticamente dos2unixem arquivos e pastas ocultos, pode usar findou dos2unix ** **/.*O **/.*expandirá apenas os arquivos e pastas ocultos, incluindo .(o diretório raiz), ..(o diretório pai) e quaisquer outras entradas ocultas na pasta atual.
dos2unixsimplesmente é impresso Skipping <dir>, not a regular file.quando executado em um diretório, portanto, executando ..e .é seguro.) Além disso, combinar lscom um globo não é uma boa maneira de verificar como o globo é expandido; use echovez: echo **imprime os argumentos que dos2unixrecebe de dos2unix **.
**implícito, e o uso echodeixa claro.
Um caso de uso comum parece ser padronizar as terminações de linha para todos os arquivos confirmados em um repositório Git :
git ls-files | xargs dos2unix
Tenha em mente que certos arquivos (por exemplo *.sln, *.bat) etc são unicamente utilizado em sistemas operacionais Windows e deve manter a CRLFterminar:
git ls-files '*.sln' '*.bat' | xargs unix2dos
Se necessário, use .gitattributes
Para qualquer usuário do Solaris (estou usando a 5.10, também pode se aplicar a versões mais recentes, bem como a outros sistemas unix):
O dos2unix não substitui o arquivo por padrão, ele apenas imprime a versão atualizada no stdout; portanto, você terá que especificar a origem e o destino, ou seja, o mesmo nome duas vezes:
find . -type f -exec dos2unix {} {} \;
for FILE in /var/www/html/files/*
do
/usr/bin/dos2unix FILE
done
Eu pesquisei isso como um milhão de vezes, então minha solução é apenas colocar essa função bash no seu ambiente.
.bashrcou .profileou o que quer
dos2unixd() {
find $1 -type f -print0 | xargs -0 dos2unix
}
Uso
$ dos2unixd ./somepath
Dessa forma, você ainda tem o comando original dos2unixe é fácil lembrar deste dos2unixd.
Se não houver subdiretório, você também pode
ls | xargs -I {} dos2unix "{}"
dos2unix *é mais simples e, na verdade, será mais robusto que isso. (Geralmente não é recomendado para canalizar a saída de ls, porque é uma ferramenta de formatação e *é mais confiável para uso programático.)
find . -type f -print0 | xargs -0 dos2unixresolveria o problema que eu acho.