我需要能够在 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。将存储库放在可移动设备上,您可以推送/拉取源。这将防止在尝试使两台计算机上的源保持最新时出现任何错误和它将解决您的编码问题。