BASH使用FIND和SED查找并替换目录中的所有文件

时间:2015-04-07 18:33:31

标签: linux bash sed find

我需要查找并替换目录中所有文件的某些字符串,包括子目录。我想我几乎使用以下方法来说明我的一般方法。我在-exec中做了更多,而不仅仅是替换,但为了清楚起见已经删除了它。

#!/bin/bash
#call with params: in_directory out_directory

in_directory=$1
out_directory=$2
export in_directory
export out_directory

#Duplicate the in_directory folder structure in out_directory
cd "$in_directory" &&
find . -type d -exec mkdir -p -- "$out_directory"/{} \;

find $in_directory -type f -name '*' -exec sh -c '
    for file do  
        #Quite a lot of other stuff, including some fiddling with $file to 
        #get rel_file, the part of the path to a file from 
        #in_directory. E.g if in_directory is ./ then file ./ABC/123.txt
        #will have rel_file ABC/123.txt

        cat $file|tr -d '|' |sed -e 's/,/|/g' > $out_directory/$rel_file
    done
' sh {} +

我可能会尝试将文件写入管道输出的一个问题。但是,这不是主要/唯一的问题,因为当我用显式测试路径替换它时,我仍然得到错误 | sed -e's /,/ | / g'|没有这样的文件或目录 这让我觉得cat $ file部分是问题?

任何帮助都会像往常一样受到大力赞赏 - 这只是我曾经写过的第二个BASH脚本所以我希望我犯了一个相当基本的错误!

1 个答案:

答案 0 :(得分:3)

你的"内心"单引号被视为"外部"单引号并导致您出现问题。您认为在|命令中引用了tr,但您实际在做的是结束带有不带引号|的初始单引号字符串然后开始一个新的单引号字符串。然后,第二个单引号字符串以您认为正在启动sed脚本的单引号结束,而是结束前一个单引号字符串等。

如果可以的话,对那些嵌入的单引号使用双引号。如果你不能这样做,你必须使用'\''序列来获得单引号字符串中的文字单引号。