파일 이름에 포함된 중복 하위 문자열을 제거하여 파일 이름 바꾸기

파일 이름에 포함된 중복 하위 문자열을 제거하여 파일 이름 바꾸기

다음 패턴을 사용하여 여러 파일의 이름을 바꿔야 합니다.

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'

관련 정보