다음 패턴을 사용하여 여러 파일의 이름을 바꿔야 합니다.
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'