동일한 쉘 명령에서 반복되는 glob 표현식을 "동기적으로" 사용할 수 있습니까?

동일한 쉘 명령에서 반복되는 glob 표현식을 "동기적으로" 사용할 수 있습니까?

끔찍한 제목이라 죄송합니다. 내가하려는 일은 다음과 같습니다. 형식의 이름을 가진 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_' '_' *

또한보십시오:

관련 정보