Bash 스크립트를 사용하여 여러 디렉터리에 있는 여러 파일의 이름을 바꾸고 싶습니다. Nishi_001부터 Nishi_772까지 772개의 디렉토리가 있습니다. 각 디렉터리의 파일 수는 다르지만 아래와 같이 파일 이름은 모든 디렉터리에서 유사하게 지정됩니다.
sample_001samout
sample_002samout
sample_003samout
sample_004samout
.
.
sample_00Nsamout N=maximum 18
각 디렉터리의 파일 이름을 각 디렉터리에 특정한 특정 이름으로 바꾸고 싶습니다. 예를 들어 Nishi_001의 경우 다음 파일이 포함되어 있습니다.
sample_001samout
sample_002samout
sample_003samout
다음 형식으로 이름을 바꿉니다.
130906_Hiseq3A_l3_017_Dr_Nishikawa_AAGGTACA_L003_R1_001samout
130906_Hiseq3A_l3_017_Dr_Nishikawa_AAGGTACA_L003_R1_002samout
130906_Hiseq3A_l3_017_Dr_Nishikawa_AAGGTACA_L003_R1_003samout
772개의 디렉토리 각각은 서로 다른 새 이름을 갖습니다. 다음과 같은 새 이름 목록이 포함된 파일이 있습니다.
Nishi_003="130906_Hiseq3B_l7_003_Dr_Nishikawa_ATGCCTAA_L007_R1"
Nishi_004="130906_Hiseq3B_l7_004_Dr_Nishikawa_AGTGGTCA_L007_R1"
Nishi_005="130906_Hiseq3B_l7_005_Dr_Nishikawa_ACCACTGT_L007_R1"
특정 디렉터리의 모든 파일 이름은 파일 원본을 식별하기 위해 동일한 이름으로 변경됩니다. 이 새 이름은 해당 특정 디렉터리에 포함된 모든 파일에서 "sample"이라는 문구를 대체합니다.
예를 들어, Nishi_001 디렉토리에서 모든 파일의 "sample"이라는 문구는 다음으로 대체되어야 합니다.
"130906_Hiseq3A_l3_017_Dr_Nishikawa_AAGGTACA_L003_R1"
Nishi_001 디렉토리의 구체적인 새 이름입니다.
답변1
맵 파일을 반복하고 디렉터리 및 이름 패턴을 두 개의 변수로 읽어서 명령에 사용해야 합니다 mv
.
sed 's/"//g' map.txt |
while IFS="=" read dir name; do
for file in "$dir"/*; do
mv "$file" "${file/sample/$name}"
done
done
설명하다
sed 's/"//g' map.txt
: 대상 이름 주위의 따옴표를 제거합니다.while IFS="=" read dir name; do
:$IFS="="
쉘에 입력을 분할하도록 지시=
하여read dir name
대상 디렉토리를 변수로 읽고$dir
이름을 에서 읽습니다$name
. 이는 명령의 출력에서 실행되므로 따옴표가 없는 것과 같습니다sed
.$name
for file in "$dir"/*; do
: 각각$dir
.mv "$file" "${file/sample/$name}"
:구문은 문자열 이 로 대체되는 위치${var/pattern/replacement}
를 인쇄합니다 . 따라서 여기에서는 파일 이름을 인쇄하고 현재 값인 .$var
pattern
replacement
sample
$name
답변2
#!/bin/bash
for file in sample_00*
do
replace_name=$(echo $file | sed "s/sample/130906_Hiseq3A_l3_017_Dr_Nishikawa_AAGGTACA_L003_R1/g" | cat )
mv $file $replace_name
done