Bash 脚本将给定类型的所有文件从 Unix 格式转换为 Dos 格式

Bash 脚本将给定类型的所有文件从 Unix 格式转换为 Dos 格式

我需要能够在 CentOS 和 Windows 之间来回切换我在这两个系统上开发的 C++ 项目。我希望能够将给定类型的所有文件(例如 *.cpp、*.h 或 *.txt)从 Unix 转换为 Dos。

我有一个转换单个文件的 bash 脚本,但我希望能够仅输入文件类型的扩展名或 *.FILETYPE 来转换该类型的给定目录中的所有文件。

这是工作脚本,我需要做什么才能使其一次适用于多个文件。我尝试过使用 for 循环,但出现语法错误。

#! /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

运行示例

$  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

答案1

Unix 到 DOS

例如,要将所有*.h文件转换为 DOS 格式:

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

该条件/\r/!告诉 sed 跳过所有已经有回车符的行。因此,对同一文件多次运行此命令是安全的。

替换命令s/$/\r/会在每行末尾添加一个回车符。

该选项-i告诉 sed 就地更改文件。如果想保留原件的备份:

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

DOS 到 UNIX

要将所有文件从 DOS 就地转换*.h为 Unix:

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

此命令也可以安全地对同一文件运行多次。

操作系统/BSD

对于 BSD(OSX) sed,选项的参数-i是强制性的,而不是可选的。因此,可以使用-i.bak扩展名进行备份.bak,或者使用-i ''在不进行备份的情况下就地更改文件。

答案2

使用find搜索要转换的文件并添加-exec(或-execdir) 操作来运行转换程序。例如,要bd2w对从当前目录开始的所有.cpp文件运行.h,请使用以下命令:

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

我必须说我同意上述评论者所表达的担忧;你这样的经历不是让你的生活变得不必要的困难吗?即使您是唯一的开发人员,如果代码位于两台不同的计算机上,我建议您在本地设置 git。将存储库放在可移动设备上,您可以推送/拉取源。这将防止在尝试使两台计算机上的源保持最新时出现任何错误它将解决您的编码问题。

相关内容