親ディレクトリの名前に基づいてファイルを繰り返し編集します。

親ディレクトリの名前に基づいてファイルを繰り返し編集します。

私は何百ものフォルダがある大きなディレクトリを持っています。ここで、xはランダムな単語です。各フォルダには3つのテキストファイルがあり、すべて「a_b_x」を含む複数の文字列が含まれています。

すべてのディレクトリの名前を変更し、ファイル内の文字列を「a_b_x」から「a_x」に変更しようとしています。これは、「b_」を削除する必要があることを意味します。すべてのファイルを手動で編集するには数時間かかりますので、いくつかのsed魔法を使ってこれを行いたいと思います。

答え1

あなたはいつも出力解析の防止ls。これを試してみてください(ありがとうございますスティーブン・チャジェラス提案./*/):

for folder in ./*/; do     
      sed -i 's/_b//g' "$f"/*; mv "$folder" "${folder/_b/}"; 
 done

答え2

あなたのため

root@testbox:~# mkdir test
root@testbox:~# cd test
root@testbox:~/test# mkdir -p a_b_x{1..10} # populate directories
root@testbox:~/test# printf 'a_b_x\na_b_y\nfoo\nbar\n' | \
    tee a_b_x{1..10}/somefile # populate files
a_b_x
a_b_y
foo
bar

ディレクトリの名前を変更する:

root@testbox:~/test# find . -name a_b_\* -type d -print0 | \
    xargs -r0 rename -v 's/a_b_/a_/'
./a_b_x10 renamed as ./a_x10
./a_b_x5 renamed as ./a_x5
./a_b_x7 renamed as ./a_x7
./a_b_x4 renamed as ./a_x4
./a_b_x8 renamed as ./a_x8
./a_b_x3 renamed as ./a_x3
./a_b_x9 renamed as ./a_x9
./a_b_x6 renamed as ./a_x6
./a_b_x1 renamed as ./a_x1
./a_b_x2 renamed as ./a_x2

ファイル編集:

root@testbox:~/test# find . ! -name \*.bak -type f -print0 | xargs -r0 sed -i.bak 's,a_b_,a_,'
root@testbox:~/test# cat a_x4/somefile
a_x
a_y
foo
bar

すべてが正常な場合は、バックアップを削除します。

root@vm8583:~/test# find . -name \*.bak -type f -delete

答え3

次のコマンドを使用できます。

for folder in $(ls); do
    for file in $(ls $folder); do
        sed -i 's/_b//' $folder/$file
    done
    mv $folder ${folder/_b/}
done
  • 最初のループはディレクトリを探索することです。

  • 2番目のループはフォルダ内のファイルの内容を編集します。

    2番目のループを離れた後、最初のループはフォルダの名前を変更することです。

IFSとして解釈されるファイル名のスペースを処理する別の方法は次のとおりです。

ls | while read folder ; do
 ls "$folder" | while read file; do
  sed -i 's/_b//' "$folder/$file"
 done
 mv "$folder" "${folder/_b/}"
done

関連情報