Script Bash para converter todos os arquivos de um determinado tipo de Unix para Dos Format

1

Eu preciso poder ir e voltar entre o CentOS e o Windows para projetos C ++ que estou desenvolvendo em ambos os sistemas. Eu quero ser capaz de converter todos os arquivos de um determinado tipo, como * .cpp, * .h ou * .txt de Unix para Dos.

Eu tenho um script bash que converte um único arquivo, mas gostaria de poder digitar apenas a extensão do tipo de arquivo ou * .FILETYPE para converter todos os arquivos em um determinado diretório desse tipo.

Aqui está o script de trabalho, o que preciso fazer para que ele funcione em mais de um arquivo por vez. Eu tentei usar um loop for, mas recebo erros de sintaxe.

#! /bin/sh

# Convert a text based file from Unix Format to Dos Format
# The Output file should be the name of the input file with
# WF inserted before the file extention
#
# Examples
#    convert Unix format abc.txt to abcWF.txt Windows Format 
#    convert Unix format abc.cpp to abcWF.cpp Windows Format 

echo "In u2w FileToConvert = $1"
    FileBase=$(basename $1)
    FileExtension="${FileBase##*.}"
    FileBase="${FileBase%.*}"
    OutputSuffix="WF.$FileExtension"
    OutputFile="$FileBase$OutputSuffix"
    commandment="unix2dos -n $1 $OutputFile"
    echo $commandment
    unix2dos -n $1 $OutputFile
    echo "diff -w $1 $OutputFile"
    diff -w "$1" "$OutputFile"

exit

Exemplo de execução

$  bd2w TestResults.txt
In u2w FileToConvert = TestResults.txt
unix2dos -n TestResults.txt TestResultsWF.txt
unix2dos: converting file TestResults.txt to file TestResultsWF.txt in DOS format ...
diff -w TestResults.txt TestResultsWF.txt
    
por pacmaninbw 16.09.2016 / 23:40

2 respostas

4

Unix para DOS

Para converter, por exemplo, todos os arquivos *.h no formato DOS:

sed -i '/\r/! s/$/\r/' *.h

A condição /\r/! informa sed para ignorar todas as linhas que já possuem um retorno de carro. Por causa disso, é seguro executar este comando várias vezes no mesmo arquivo.

O comando de substituição, s/$/\r/ , adiciona um retorno de carro ao final de cada linha.

A opção -i informa ao sed para alterar o arquivo no local. Se alguém quisesse manter backups dos originais:

sed -i.bak '/\r/! s/$/\r/' *.h

DOS para Unix

Para converter no local todos os arquivos *.h do DOS para o Unix:

sed -i 's/\r$//' *.h

Este comando também é seguro para ser executado várias vezes nos mesmos arquivos.

OSX / BSD

Para o BSD (OSX) sed, o argumento para a opção -i é obrigatório, não opcional. Portanto, use -i.bak para fazer um backup com extensão .bak ou use -i '' para alterar os arquivos in-loco sem fazer backup.

    
por 17.09.2016 / 00:11
1

Use o find para pesquisar os arquivos que você deseja converter e adicione a ação -exec (ou -execdir ) para executar o programa de conversão. Por exemplo, para executar bd2w em todos os arquivos .cpp e .h a partir do diretório atual, use o seguinte comando:

find . -type f -name "*.cpp" -o -name "*.h" -exec bd2w '{}' \;

Devo dizer que compartilho as preocupações expressas pelos comentadores acima; você não está dificultando sua vida desnecessariamente passando por aros como esse? Mesmo se você for o único desenvolvedor, se o código estiver em dois computadores diferentes, sugiro que você configure o git localmente. Coloque o repo em um dispositivo removível de / para você pode empurrar / puxar as fontes. Isso evitará erros ao tentar manter as fontes atualizadas nas duas máquinas e que resolverão seus problemas de codificação.

    
por 17.09.2016 / 18:27