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
find
invocação não faz essa verificação (embora isso seja simples o suficiente para adicionar), mas o moderno dos2unix
ignora 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.
n
por 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 .
endlines
está 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 dos2unix
sã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 bash
versã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 .bashrc
qualquer 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.
dos2unix
alias que afeta a maneira como os argumentos são expandidos. Qual é a saída do type dos2unix
seu sistema?
**
vez de, find
é "pular arquivos e pastas ocultos, como .git
". dos2unix
nunca vê os arquivos ocultos, porque **
não se expande para mostrá-los. Se você deseja executar automaticamente dos2unix
em arquivos e pastas ocultos, pode usar find
ou 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.
dos2unix
simplesmente é impresso Skipping <dir>, not a regular file.
quando executado em um diretório, portanto, executando ..
e .
é seguro.) Além disso, combinar ls
com um globo não é uma boa maneira de verificar como o globo é expandido; use echo
vez: echo **
imprime os argumentos que dos2unix
recebe de dos2unix **
.
**
implícito, e o uso echo
deixa 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 CRLF
terminar:
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.
.bashrc
ou .profile
ou o que quer
dos2unixd() {
find $1 -type f -print0 | xargs -0 dos2unix
}
Uso
$ dos2unixd ./somepath
Dessa forma, você ainda tem o comando original dos2unix
e é 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 dos2unix
resolveria o problema que eu acho.