끔찍한 제목이라 죄송합니다. 내가하려는 일은 다음과 같습니다. 형식의 이름을 가진 1000개의 파일이 포함된 디렉토리가 있습니다 Foo_bar_1,...,Foo_bar_1000
. 각 파일 이름에서 "바"를 제거하고 싶습니다. 단일 파일의 경우 이는 쉽습니다. 예를 들면 다음과 같습니다 mv Foo_bar_1 Foo_1
.
분명히 루프를 사용하여 이런 방식으로 모든 파일을 처리할 수 있습니다. 그러나 mv
정규식 명령을 사용하여 반복하지 않고 이 작업을 수행 할 수 있는 쉬운 방법이 있는지 궁금합니다 . 어떤 소스 파일이든 표현식과 일치시킬 수 있습니다 Foo_bar_*
. 이제 일치하는 텍스트에 "액세스"할 수 있는 방법이 있나요 *
?
mv Foo_bar_* Foo_*
내가 쓰고 싶은 것은 대상 파일의 두 번째 항목이 소스 파일의 일치하는 문자열 *
과 같아야 하는 것과 같은 것입니다 . *
이것이 어떻게 달성될 수 있습니까?
답변1
와일드카드는 쉘에 의해 확장됩니다.앞으로명령이 실행됩니다. 따라서 다음이 실행됩니다.
mv Foo_bar_1 Foo_bar_2 ... Foo_bar_1000 Foo_bar_1 Foo_bar_2 ... Foo_bar_1000
또는 유사한 파일이 있는 경우 Foo_foo_1
두 번째 와일드카드와 일치하므로 해당 파일도 추가됩니다.
아니요, 불가능합니다.
또한 mv
단일 대상만 허용됩니다.
루프 를 만들 수 있습니다 for
:
for f in *; do mv "$f" "${f/_bar_/_}"; done
또는 일괄 이름 바꾸기 도구를 사용하십시오.
Perl 이름 바꾸기 도구:
rename 's/_bar_/_/' *
"일반" 이름 바꾸기 도구:
rename '_bar_' '_' *
또한보십시오: