(숫자) 폴더 이름을 반영하도록 기존 스크립트 줄의 값을 어떻게 변경합니까?

(숫자) 폴더 이름을 반영하도록 기존 스크립트 줄의 값을 어떻게 변경합니까?

여러 폴더(0~41로 표시)가 있는 작업을 실행 중입니다. 각 폴더에는 동일한 스크립트가 포함되어 있으며 9번째 줄을 편집해야 합니다.

#SBATCH -J aXau19

X는 폴더 이름(0,1,2...등)과 일치해야 합니다.

수동으로 변경하는 대신 이를 자동화하기 위해 bash 스크립트를 작성하는 방법을 찾으려고 노력 중입니다.

저는 Linux를 처음 접했지만 제가 하려는 작업에 대한 일반적인 아이디어는 다음과 같습니다.

for d in */; do;

#open script.sh in vi

# move down eight, across 12

#go into insert mode

#delete x

#take the directory name (just the number, not the full path)

#insert the directory name in place of x

#save and exit

done

어떤 조언이라도 대단히 감사하겠습니다!

답변1

이것은 ed(1)for loop솔루션입니다.

Ed는 9번째 줄을 변경하고 이를 X디렉터리 이름으로 바꿔야 합니다.


나는 그것이 어떻게 완료되었는지 보여주기 위해 작은 장면을 만들었습니다.

/tmp에 테스트 디렉토리를 만들고 0~41 사이의 빈 디렉토리를 만듭니다.

mkdir -p /tmp/testing/{0..41}

디렉터리 확인

ls /tmp/testing
0/  1/  10/ 11/ 12/ 13/ 14/ 15/ 16/ 17/ 18/ 19/ 2/  20/ 21/ 22/ 23/ 24/ 25/ 26/ 27/ 28/ 29/ 3/  30/ 31/ 32/ 33/ 34/ 35/ 36/ 37/ 38/ 39/ 4/  40/ 41/ 5/  6/  7/  8/  9/ 

일부 파일을 만들고 일부 콘텐츠를 작성합니다.

for d in /tmp/testing/*/; do
  printf '%s\n' {1..20}'#SBATCH -J aXau19' > "$d"/myscript$RANDOM$RANDOM$RANDOM.sh
done

새로 생성된 파일을 확인해보세요.

ls /tmp/testing/*
/tmp/testing/0:
myscript11901287773897.sh

/tmp/testing/1:
myscript22167100654321.sh

/tmp/testing/10:
myscript267471903230794.sh

/tmp/testing/11:
myscript21767360022483.sh

/tmp/testing/12:
myscript282132941319693.sh

/tmp/testing/13:
myscript6970151065611.sh

/tmp/testing/14:
myscript11068731012744.sh

/tmp/testing/15:
myscript19107175771.sh

/tmp/testing/16:
myscript12252298818021.sh

/tmp/testing/17:
myscript105202172129231.sh

/tmp/testing/18:
myscript2567385425240.sh

/tmp/testing/19:
myscript29570230212538.sh

/tmp/testing/2:
myscript11241700021570.sh

/tmp/testing/20:
myscript31918599925170.sh

/tmp/testing/21:
myscript21633144421815.sh

/tmp/testing/22:
myscript855984144154.sh

/tmp/testing/23:
myscript141701948311464.sh

/tmp/testing/24:
myscript26914582213221.sh

/tmp/testing/25:
myscript269851807416209.sh

/tmp/testing/26:
myscript12238285945162.sh

/tmp/testing/27:
myscript8701215006016.sh

/tmp/testing/28:
myscript11741830229037.sh

/tmp/testing/29:
myscript37121942613269.sh

/tmp/testing/3:
myscript252821857619268.sh

/tmp/testing/30:
myscript17684744220712.sh

/tmp/testing/31:
myscript67311600129127.sh

/tmp/testing/32:
myscript108853017115842.sh

/tmp/testing/33:
myscript223492431721664.sh

/tmp/testing/34:
myscript2802185356971.sh

/tmp/testing/35:
myscript19012307732797.sh

/tmp/testing/36:
myscript24174670724297.sh

/tmp/testing/37:
myscript3019178819832.sh

/tmp/testing/38:
myscript264601159329258.sh

/tmp/testing/39:
myscript6962410715067.sh

/tmp/testing/4:
myscript262302179122509.sh

/tmp/testing/40:
myscript14175285225742.sh

/tmp/testing/41:
myscript1053466403145.sh

/tmp/testing/5:
myscript263762898927462.sh

/tmp/testing/6:
myscript152723179213229.sh

/tmp/testing/7:
myscript222431803611235.sh

/tmp/testing/8:
myscript25041944217942.sh

/tmp/testing/9:
myscript16570686525823.sh

파일의 내용을 확인하세요.

tail -n+1 /tmp/testing/*/*.sh

각 파일에는 다음 내용이 포함되어 있습니다.

1#SBATCH -J aXau19
2#SBATCH -J aXau19
3#SBATCH -J aXau19
4#SBATCH -J aXau19
5#SBATCH -J aXau19
6#SBATCH -J aXau19
7#SBATCH -J aXau19
8#SBATCH -J aXau19
9#SBATCH -J aXau19
10#SBATCH -J aXau19
11#SBATCH -J aXau19
12#SBATCH -J aXau19
13#SBATCH -J aXau19
14#SBATCH -J aXau19
15#SBATCH -J aXau19
16#SBATCH -J aXau19
17#SBATCH -J aXau19
18#SBATCH -J aXau19
19#SBATCH -J aXau19
20#SBATCH -J aXau19

이제 파일을 편집하세요.

for d in /tmp/testing/*/*.sh; do
  printf '%s\n' "9,s/X/${d##*/}/" w | ed -s "$d"
done

편집된 파일의 내용을 확인하세요ed(1)

tail -n+1 /tmp/testing/*/*.sh

귀하의 질문을 이해한다면 vi/vim 요구 사항을 제외하고 귀하가 원하는 것이 바로 그것입니다.

관련 정보