私は何百ものフォルダがある大きなディレクトリを持っています。ここで、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