xargs, sed 및 명령 대체 결합

xargs, sed 및 명령 대체 결합

Bash에서는 다음과 같은 결과가 나올 것으로 예상됩니다.

 ls *.py | xargs -I{} echo $(echo {} | sed 's/\.py/_2\.py/g')

디렉터리에 포함된 모든 .py 파일을 나열하지만 파일 이름 뒤와 .py 확장자 앞에 _2가 추가됩니다.

그러나 그렇지 않습니다. 변경 사항 없이 디렉터리의 .py 파일만 나열합니다.

간단히 말해서:

$ ls
A.py  B.py

$ ls *.py | xargs -I{} echo $(echo {} | sed 's/\.py/_2\.py/g')
A.py
B.py

내 예상 결과는 다음과 같습니다.

A_2.py
B_2.py

여기서 무슨 일이 일어나고 있으며 예상되는 출력을 얻는 방법은 무엇입니까?

답변1

이는 서브쉘의 명령, 즉

echo {} | sed 's/\.py/_2\.py/g'

에코 전에 실행되므로 이 명령 뒤의 명령은 다음과 같습니다.

xargs -I{} echo {}

이는 단순히 모든 파일 이름을 에코합니다.

find 명령을 사용할 수 있습니다.

find directory_name -name '*.py' \
-exec rename 's/.py/_2.py/' {} +

단 하나의 명령으로 모든 파일의 이름을 바꿀 수 있습니다.

하위 디렉토리가 아닌 현재 디렉토리에서만 파일을 찾으려면 maxdepth 1다음 옵션을 사용하십시오.

find directory_name -maxdepth 1 -name '*.py' \
-exec rename 's/.py/_2.py/' {} +

관련 정보