![파일 이름에 포함된 중복 하위 문자열을 제거하여 파일 이름 바꾸기](https://linux55.com/image/197080/%ED%8C%8C%EC%9D%BC%20%EC%9D%B4%EB%A6%84%EC%97%90%20%ED%8F%AC%ED%95%A8%EB%90%9C%20%EC%A4%91%EB%B3%B5%20%ED%95%98%EC%9C%84%20%EB%AC%B8%EC%9E%90%EC%97%B4%EC%9D%84%20%EC%A0%9C%EA%B1%B0%ED%95%98%EC%97%AC%20%ED%8C%8C%EC%9D%BC%20%EC%9D%B4%EB%A6%84%20%EB%B0%94%EA%BE%B8%EA%B8%B0.png)
다음 패턴을 사용하여 여러 파일의 이름을 바꿔야 합니다.
sub-2795479_ses-V1_task-rest_acq-REST1_dir-AP_run-01_run-01_run-01_run-01_run-01_run-01_run-01_run-01_run-01_run-01_run-01_run-01_run-01_run-01_run-01_run-01_run-01_bold.json
도착하다
sub-2795479_ses-V1_task-rest_acq-REST1_dir-AP_run-01_bold.json
run-01_
각 파일 이름에는 4가지 가능성 (또는 run-02_
, run-03_
, run-04
) 중 한 가지 유형의 하위 문자열만 포함됩니다.
하위 문자열은 run-0[1-4]_
주어진 파일에서 무작위로 여러 번 반복될 수 있습니다.
나는 정신을 잃었고 내가 찾을 수 있는 가장 가까운 것은스택 오버플로에 대한 이 질문. 그러나 문자열 조작에 대한 나의 제한된 지식을 바탕으로 더 많은 도움을 원합니다!
답변1
또는 펄:
$ f=sub-2795479_ses-V1_task-rest_acq-REST1_dir-AP_run-01_run-01_run-01_run-01_run-01_run-01_run-01_run-01_run-01_run-01_run-01_run-01_run-01_run-01_run-01_run-01_run-01_bold.json
$ g=$(perl -pe 's/(_run-0[1-4])\1+/$1/' <<< "$f")
$ echo "$g"
sub-2795479_ses-V1_task-rest_acq-REST1_dir-AP_run-01_bold.json
Perl 스타일 rename(1)
프로그램을 사용하십시오:
$ touch "$f"
$ ls sub*json
sub-2795479_ses-V1_task-rest_acq-REST1_dir-AP_run-01_run-01_run-01_run-01_run-01_run-01_run-01_run-01_run-01_run-01_run-01_run-01_run-01_run-01_run-01_run-01_run-01_bold.json
$ rename 's/(_run-0[1-4])\1+/$1/' sub*json
$ ls sub*json
sub-2795479_ses-V1_task-rest_acq-REST1_dir-AP_run-01_bold.json
답변2
사용매개변수 확장:
for i in *.json; do
a="${i##*_run}"
b="${i%%_run*}"
n="$b""_run$a"
# mv -- "$i" "$n"
printf "%s" "$n"
done
sub-2795479_ses-V1_task-rest_acq-REST1_dir-AP_run-01_bold.json
그런 다음 이름을 바꿉니다.
mv -- "$i" "$n"
참고: 삭제/이동 작업을 수행할 때 파일을 백업하십시오.
답변3
간단한 처리보다 상황이 복잡해지면 rename
기본적으로 동일한 패턴으로 짧은 스크립트를 작성하는 경향이 있습니다.
for file in *.json
do
changedname="$(echo "$file" | sed 's/regex/replacement/flags')"
mv -- "$file" "$changedname"
done
귀하의 경우 문자열을 찾고 run-0[1-4]_
빈 문자열``로 바꾸면 플래그에 g
"줄 끝에 도달할 때까지 이 작업을 여러 번 수행"이 포함됩니다.
sed 's/run-0[1-4]_//g'
그것이 당신의 목표입니다.
처음 나타나는 곳을 삭제만 하지 않는다면 어렵지 않습니다!
sed -e 's/\(run-0[1-4]_.*\)run-0[1-4]_/\1/g'