2015-04-07 109 views
2

我需要查找並替換目錄中所有文件(包括子目錄)的某些字符串。我想我差不多用下面的方法來說明我的一般方法。我在-exec裏面做的不僅僅是這個替換,而是爲了清晰起見刪除了這個。BASH使用FIND和SED查找並替換目錄中的所有文件

#!/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'|沒有這樣的文件或目錄 這使我認爲貓$文件的一部分是問題?

任何幫助一如既往地受到大衆的歡迎 - 這只是我寫過的第二個BASH腳本,所以我期望我已經犯了一個相當基本的錯誤!

+0

您是否確定您的目的地目錄存在? 'mkdir -p「$ out_directory」' –

+1

注意引用你的變量:文件名可以包含空格:'cat「$ file」| ...>「$ out_directory/$ rel_file」' –

回答

3

您的「內部」單引號被視爲「外」單引號引起您的問題。您認爲您在命令中引用了|,但您實際上在做什麼是結尾具有未引用的|的初始單引號字符串,然後啓動新的單引號字符串。然後,第二個單引號字符串以單引號結尾,您認爲該引號是開始sed腳本,而不是結束先前的單引號字符串等。

如果可以,請爲這些嵌入的單引號使用雙引號。如果你不能這樣做,你必須使用'\''序列來得到單引號字符串中的文字單引號。

相關問題