-1

このスクリプトには問題があります。スクリプトは、すべてのファイルとすべてのサブディレクトリとサブファイルを (再帰的に) 通過することになっています。ファイルが拡張子.txtで終わる場合、テキスト内の文字/単語を新しい文字/単語に置き換えてから、既存のディレクトリにコピーする必要があります。最初の引数は検索を開始する必要があるディレクトリ、2 番目は古い文字/単語、3 番目は新しい文字/単語、4 番目はファイルをコピーするディレクトリです。スクリプトはファイルを通過しますが、置換のみを行い、元のディレクトリからファイルをコピーします。ここにスクリプトがあります

#!/bin/bash

funk(){
  for file in `ls $1`
  do
    if [ -f $file ]
    then
      ext=${file##*.}
      if [ "$ext" = "txt" ]
      then
        sed -i "s/$2/$3/g" $file
        cp $file $4
      fi
    elif [ -d $file ]
    then
      funk $file $2 $3 $4
    fi
  done
}

if [ $# -lt 4 ]
then
  echo "Need more arg"
  exit 2;
fi

cw=$1
a=$2
b=$3
od=$4
funk $cw $a $b $od
4

2 に答える 2

-2

指摘したように、find 出力をループすることはお勧めできません。また、検索と置換でスラッシュをサポートしていません。

gniourf_gniourf の回答を確認してください。


それに使っfindてみてはどうでしょうか。

 #!/bin/bash

 funk () {
     local dir=$1; shift
     local search=$1; shift
     local replace=$1; shift
     local dest=$1; shift

     mkdir -p "$dest"
     for file in `find $dir -name *.txt`; do
         sed -i "s/$search/$replace/g" "$file"
         cp "$file" "$dest"
     done
 }

 if [[ $# -lt 4 ]] ; then
     echo "Need 4 arguments"
     exit 2;
 fi

 funk "$@"

サブディレクトリに同じ名前のファイルがある場合でも、それらは上書きされます。それはあなたの場合の問題ですか?

于 2013-06-30T14:25:33.553 に答える