유닉스 사용
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
이름 변경이 가능하도록 제거합니다.
이상한 파일 이름을 방지하기 위해 두 가지 작업을 수행했습니다.
- 초기 와일드카드(원본 이름 )
*\**
앞에 ; 를 붙이면./
모든 파일 이름이 ;$file
로 시작됩니다 . 따라서 파일 이름은 하이픈으로 시작할 수 없으므로 명령이 이를 옵션으로 잘못 해석할 수 있습니다../
./1000_All_Map_20220926182235.csv
mv
- "옵션의 잘못된 해석"에 대한 추가 보호 계층으로 파일 이름을 제공하기 전에
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
스위치를 제거하십시오.