파일이 포함된 폴더가 있습니다.
a1.cpp
a2.cpp
a3.cpp
a4.cpp
a5.cpp
a6.cpp
2~5 범위의 파일 확장자를 .java로 변경하고 싶습니다.
루프를 사용하지 않고 xargs를 사용하여 이러한 파일의 이름을 어떻게 바꿀 수 있습니까?
최종 출력은 다음과 같습니다.
a1.cpp
a2.java
a3.java
a4.java
a5.java
a6.cpp
답변1
항상 그렇듯이 filenames 과 함께 사용 xargs
하면조심해야 해파일 이름에 중요한 문자가 포함된 경우.
즉, GNU 버전의 find
sum xargs
과 -print0
sum -0
옵션이 있다고 가정하면 다음을 수행할 수 있습니다.
find . -type f -name 'a[2-5].cpp' -print0 | xargs -0 rename 's/cpp$/java/'
find
이는 요구 사항에 따라 관련 파일 목록을 생성하고 공백 등이 포함된 파일 이름을 올바르게 처리할 수 있도록 NULL로 끝나는 문자열로 출력하는 데 사용됩니다 . 그런 다음 xargs
적절한 옵션을 사용하여 스타일 이름 변환 명령을 제공할 수 있는 -0
(외부) 도구를 호출합니다 ( @ilkkachu가 지적한 것처럼 util-linux 변형이 아닌 Perl 기반 도구를 가정합니다.rename
sed
rename
여기토론을 위해).
이것이 using 의 "유효한 방법"이라고 할 수 있는지는 모르겠지만 귀하의 의견에 따르면 꽤 견고한 방법인 s 의 가능성을 xargs
탐구하고 싶다고 생각합니다 . xarg
설명하는 작업은 다음과 같이 명령을 xargs
완전히 사용 하지 않고 셸 구문 기능을 사용하여 완전히 수행할 수 있습니다.rename
rename 's/cpp$/java/' a[2-5].cpp
rename
Perl 버전 은 없지만 util-linux
변형이 있는 경우 해당 명령은 다음과 같습니다.
rename ".cpp" ".java" a[2-5].cpp
그러나 정규식 스타일 앵커가 없기 때문에 이 앵커가 대체됩니다.첫 번째독창적인 패턴과 대체의 출현. 이 경우 파일 접미사를 변경하는 작업이 있는데 .cpp
이름 끝에서 한 번만 발생하므로 문제가 되지 않을 것 같지만 일반적으로 명령을 작성할 때 주의가 필요합니다.