상위 디렉터리의 이름을 기반으로 파일을 반복적으로 편집합니다.

상위 디렉터리의 이름을 기반으로 파일을 반복적으로 편집합니다.

나는 수백 개의 폴더가 있는 큰 디렉토리를 가지고 있는데, 모두 "a_b_x"라는 명명 체계를 따릅니다. 여기서 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
  • 첫 번째 루프는 디렉토리를 탐색하는 것입니다.

  • 두 번째 루프는 폴더에 있는 파일의 내용을 편집합니다.

    두 번째 루프를 떠난 후 첫 번째 루프는 폴더 이름을 바꾸는 것입니다.

IFS로 해석될 파일 이름의 공백을 처리하는 또 다른 방법은 다음과 같습니다.

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

관련 정보