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/' {} +