파일 이름의 "*"를 "all"로 바꿉니다.

파일 이름의 "*"를 "all"로 바꿉니다.

유닉스 사용

Linux tinaroo1.local 3.10.0-693.5.2.el7.x86_64 #1 SMP Fri Oct 20 20:32:50 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux

이름에 *가 포함된 파일이 몇 개 있습니다.

1000_*_Map_20220926182235.csv
16000_*_48_Result_Lead_20220926200445.csv

"all" rename을 사용하기 위해 하나의 명령으로 모든 파일의 이름을 바꾸는 방법*

따라서 이러한 파일은

1000_All_Map_20220926182235.csv
16000_All_48_Result_Lead_20220926200445.csv

답변1

Bash 쉘 사용(GNU/Linux 설치에서 일반적):

for file in ./*\**
do 
  [ -f "$file" ] || continue
  echo mv -- "${file}" "${file/\*/All}"
done

*이는 파일 이름 어딘가에 별표( )가 있는 파일을 반복합니다. 별표는 쉘의 와일드카드이므로 다른 두 문자는 다른 문자와 일치하도록 이스케이프해야 합니다. 별표 주변. 일치하는 각 파일 이름은 루프에 변수로 전송됩니다 $file. 루프의 첫 번째 명령은 일반 파일을 다루고 있는지 확인합니다. 일반 파일이 아닌 항목은 건너뜁니다. 다음 명령 -- mv--은 파일 이름을 바꿉니다. 새 파일 이름은 bash의 인수 확장을 사용하여 생성됩니다. 구문은 다음과 같습니다. 첫 번째 별표 문자(실제 별표와 일치하기 위해 다시 이스케이프됨)를 텍스트로 바꿉니다 All.

echo무슨 일이 일어나는지 보여주기 위해 루프를 실행 하고, echo이름 변경이 가능하도록 제거합니다.

이상한 파일 이름을 방지하기 위해 두 가지 작업을 수행했습니다.

  1. 초기 와일드카드(원본 이름 ) *\**앞에 ; 를 붙이면 ./모든 파일 이름이 ; $file로 시작됩니다 . 따라서 파일 이름은 하이픈으로 시작할 수 없으므로 명령이 이를 옵션으로 잘못 해석할 수 있습니다.././1000_All_Map_20220926182235.csvmv
  2. "옵션의 잘못된 해석"에 대한 추가 보호 계층으로 파일 이름을 제공하기 전에 mv옵션을 추가하여 옵션의 끝을 알립니다 .--

답변2

시스템에 이미 설치되어 있는 rename이 소프트웨어 패키지를 사용할 수도 있습니다 .util-linux

테스트 실행을 수행합니다.

rename -nv '*' All *

파일 이름을 바꿉니다.

rename '*' All *

쉘 확장을 방지하려면 일치시킬 표현식의 별표를 따옴표로 묶어야 합니다. 표현식은 정규 표현식이 아닌 고정 문자열을 사용하여 일치하므로 이스케이프가 필요하지 않습니다.

답변3

필수 zsh질문:

autoload -Uz
zmv -n '(**/)(*[*]*.csv)' '$1${2//[*]/All}'

( -n만족스러우면 연습 실행을 위해 삭제하세요 ).

답변4

이것은 RHEL 7 또는 CentOS 7이므로 다른 답변 외에도 perl rename 유틸리티를 사용할 수 있습니다.

설치되지 않은 경우

yum install prename -y

*모든 파일을 이름에 로 바꾸려면 다음을 수행하십시오 .

prename -n 's/\*/All/' ./*

이름에 다음이 포함된 파일에서만 작동하며 *스위치 -n는 파일에서 작동하는 대신 stdout에 발생하는 내용을 보냅니다. *쉘 및 펄 정규식 모두에 대한 특수 문자입니다. 우리는 작은 따옴표를 사용하여 셸에서 탈출하고 \정규식 내에서는 특별한 정규식 연산자 의미를 잃습니다. 대안은 's/[*]/All/'또는 `'s/\Q*\E/All/'입니다.

결과가 만족스러우면 -n스위치를 제거하십시오.

관련 정보