Linux 递归文本替换和文件扩展名重命名

Linux 递归文本替换和文件扩展名重命名,linux,bash,shell,Linux,Bash,Shell,我正在使用一个在Linux服务器上创建文本文件的应用程序。然后,我能够执行一个shell脚本(BASH 3.2.57),在该脚本中,我需要将文本文件从Unix行结尾转换为DOS,并将文件扩展名从.txt更改为.log 我目前有一个基于sed的命令来执行此操作。此命令由应用程序在运行时重写,以指向特定的文件夹和文件名,在本例中,您可以看到ABC(在我所有的示例中,所有大写字母3都是一个变量,可以是任意3个字母) 问题是,如果用户几乎同时为两个不同的组运行应用程序,例如ABC和DEF,则在ABC有机

我正在使用一个在Linux服务器上创建文本文件的应用程序。然后,我能够执行一个shell脚本(BASH 3.2.57),在该脚本中,我需要将文本文件从Unix行结尾转换为DOS,并将文件扩展名从.txt更改为.log

我目前有一个基于sed的命令来执行此操作。此命令由应用程序在运行时重写,以指向特定的文件夹和文件名,在本例中,您可以看到ABC(在我所有的示例中,所有大写字母3都是一个变量,可以是任意3个字母)

问题是,如果用户几乎同时为两个不同的组运行应用程序,例如ABC和DEF,则在ABC有机会启动并处理文件之前,脚本将被DEF变量覆盖。此外,该.txt是留在文件夹不管,我想被删除

我的一个朋友提出了下面的代码,如果它被确定为我们最好的解决方案,那么它似乎可以工作,但是我认为并希望我们有一个更干净、更动态的方法来实现这一点。此外,当前的方法要求当我的用户决定添加GHI目录和文件时,我现在必须更新代码,我可以为我的应用程序编写代码,但我不希望每次应用程序想要使用它时都必须重写此脚本

pushd /rootfolder/parentfolder/ABC
if [[ -f prABC.txt ]]
  then
    sed 's/$/\r/' prABC.txt > prABC.log
    rm prABC.txt
fi
popd

pushd /rootfolder/parentfolder/DEF
if [[ -f prABC.txt ]]
  then
    sed 's/$/\r/' prABC.txt > prABC.log
    rm prABC.txt
fi
popd
我想随时从我的应用程序调用此脚本,它会在/rootfolder/parentfolder/目录下找到任何名为pr*.txt的文件(如果必须在搜索中包含parentfolder,这不会有问题),并将行尾从LF转换为CRLF,并将文件扩展名从.txt更改为.log


我已经做了大量的搜索,找到了近似的解决方案,但并不完全是我所需要的,我希望确保它尽可能安全(使用“find with for”时出现问题。我不知道此版本上安装了哪些实用程序,所以我希望尽可能保持它的基本/可支持性,提前感谢:)在脚本中几乎不需要
pushd
popd
。事实上,您也很少需要
cd

#/bin/bash
对于/rootfolder/parentfolder/ABC/rootfolder/parentfolder/DEF中的d
做
如果[-f“$d/prABC.txt”]]
然后
sed的/$/\r/“$d/prABC.txt”>“$d/prABC.log”&&
rm“$d/prABC.txt”
fi
完成
回想一下,
a&b

if a; then
    b
fi
换句话说,如果
sed
失败(因为无法读取源文件,或者无法写入目标文件),我们就不会
rm
源文件。应该已经有一条错误消息,所以我们不会再添加另一条

这不仅更加简洁,而且如果您决定重命名旧文件而不是删除旧文件,或者希望过滤掉
sed
脚本中包含“beef”的所有行,那么更改也更容易。一般来说,你应该避免重复代码;另见


如果您在Unix上的文件中需要DOS行结尾,则在某些地方会出现严重错误。

您几乎不应该在脚本中需要
pushd
popd
。事实上,您也很少需要
cd

#/bin/bash
对于/rootfolder/parentfolder/ABC/rootfolder/parentfolder/DEF中的d
做
如果[-f“$d/prABC.txt”]]
然后
sed的/$/\r/“$d/prABC.txt”>“$d/prABC.log”&&
rm“$d/prABC.txt”
fi
完成
回想一下,
a&b

if a; then
    b
fi
换句话说,如果
sed
失败(因为无法读取源文件,或者无法写入目标文件),我们就不会
rm
源文件。应该已经有一条错误消息,所以我们不会再添加另一条

这不仅更加简洁,而且如果您决定重命名旧文件而不是删除旧文件,或者希望过滤掉
sed
脚本中包含“beef”的所有行,那么更改也更容易。一般来说,你应该避免重复代码;另见


如果您在Unix上的文件中需要DOS行结尾,则某些地方会出现严重错误。

#1,不要为不同的“组”使用相同的自动生成脚本名称。使用
mktemp
可以轻松生成唯一的文件名<代码>人它#2、
find
可以为您定位文件#3,do
sed-i…&mv.txt.log
而不是试图用sed(和rm)来完成这一切。检查
unix2dos
dos2unix
,它们对于行尾非常有效。但它们不是基本套餐的一部分。。。您的呼叫#1,不要为不同的“组”使用相同的自动生成脚本名称。使用
mktemp
可以轻松生成唯一的文件名<代码>人它#2、
find
可以为您定位文件#3,do
sed-i…&mv.txt.log
而不是试图用sed(和rm)来完成这一切。检查
unix2dos
dos2unix
,它们对于行尾非常有效。但它们不是基本套餐的一部分。。。您的呼叫感谢@tripleee审阅代码。如果我正确地阅读了您的更新,那么我必须在in语句之后列出每个子目录,对吗?当前设置有67个子目录。我能说“for d in/rootfolder/parentfolder do”让它检查该点下的每个子文件夹吗?lol,肯定是出了问题。我正在将此文件发送到另一个基于windows的系统,他们的导入应用程序因/rootfolder/parentfolder/*/中缺少d的CRLF
将循环遍历
/rootfolder/parentfolder
的所有子目录。如果这不是你想要的,(接受这个答案)问一个新问题,并给出一个恰当的解释。先生,这确实是我想要的。谢谢你!感谢@tripleee审阅代码。如果我正确地阅读了您的更新,那么我必须在in语句之后列出每个子目录,对吗?这是当前的设置