프로젝트에서 .pyc 파일을 모두 제거하려면 어떻게합니까?


677

상당히 큰 프로젝트에서 일부 파일의 이름을 바꾸고 남은 .pyc 파일을 제거하고 싶습니다. bash 스크립트를 시도했습니다.

 rm -r *.pyc

그러나 그것은 내가 생각했던 것처럼 폴더를 통해 재귀되지 않습니다. 내가 무엇을 잘못하고 있지?


11
UNIX에서는 glob가 프로그램이 실행되는 것이 아니라 쉘에 의해 확장되기 때문에 작동하지 않습니다. 현재 디렉토리에 a.pyc 및 b.pyc가 있고 디렉토리 foo 및 bar rm가 인수 [-r, a.pyc, b.pyc]와 함께 호출됩니다.
ephemient

1
코드를 다른 사람에게 푸시하는 것에 대해 걱정하고 있다면 .gitignore에 코드를 추가 **/*.pyc하면 다시 걱정할 필요가 없습니다.
bubakazouba

답변:


1166
find . -name "*.pyc" -exec rm -f {} \;

385
당신은 그냥 할 수 있도록 찾기는 내장 "-delete"작용을find . -name \*.pyc -delete
크리스토퍼

51
가장 중요한 것은 이것이 dev 머신 인 경우 PYTHONDONTWRITEBYTECODE = True를 설정할 수 있으며이 작업을 다시 수행 할 필요가 없습니다. 이 답변을 참조하십시오 .
mlissner

5
당신은 인용하지 않습니다 {}. 실수로 단어를 분리하여 찾은 경로의 일부처럼 호출되는 중간 경로를 삭제하면 어떻게됩니까?
Robottinosino

20
-delete는 POSIX 사양의 일부가 아니며의 모든 구현에 존재한다고 보장되지는 않습니다 find.
chepner

7
두려운 경우 (좋을 수도 있음) -exec echo {}를 사용하여 첫 번째 패스를 만들거나, 매우 두려운 경우 매번 묻는 rm -i {} 또는 rm-v {}를 사용하여 당신은 삭제합니다.
jeanM

1021

find . -name '*.pyc' -delete

확실히 가장 간단합니다.


21
당신의 버전의 find지원 -delete; POSIX 표준의 일부가 아닙니다.
chepner

4
.pyo 파일과 __pycache__디렉토리 는 무시합니다 . 내 대답을 참조하십시오.
Wilfred Hughes

나는 받아 들인 대답의 코드를 사용했지만 효과가 있었지만이 명령은 더 짧고 간단합니다
Dap

3
-name '*.py?'포함.pyo, .pyc,...
cdosborn

2
MAKE SURE-삭제는 명령의 마지막 항목입니다. 찾기 직후 실수로 삭제합니다. 모든 것을 삭제했습니다!
thinkanotherone

85

데비안의 현재 버전에는 패키지에 있는 pyclean스크립트가 python-minimal있습니다.

사용법은 간단합니다.

pyclean .

34
pyclean은 해당 .py 파일이있는 .pyc 파일 만 삭제하는 것으로 보입니다 (적어도 내 시스템-우분투 12.10). 소스 파일이 삭제되어 원하는 상황에서는 매우 유용하지 않습니다. 남은 .pyc 파일을 정리합니다.
tigerFinch

@holms pyclean(및 현재 py3clean)는 데비안 패키지에서 시작되었으므로 RHEL에 없습니다.
duozmo

83

에 추가 ~/.bashrc:

pyclean () {
        find . -type f -name "*.py[co]" -delete
        find . -type d -name "__pycache__" -delete
}

이렇게하면 모든 .pyc 및 .pyo 파일과 __pycache__디렉토리가 제거됩니다 . 또한 매우 빠릅니다.

사용법은 간단합니다.

$ cd /path/to/directory
$ pyclean

find . -type d -name "__pycache__" -delete폴더가 삭제되기 전에 내용이 대기열에 추가되기 때문에 누락 된 경로에 대한 경고를 표시하는 경우가 종종 있습니다. 2>/dev/null그 문제를 해결해야합니다.
Mad Physicist

53

bash> = 4.0 (또는 zsh)을 사용하는 경우

rm **/*.pyc

전체 디렉토리 트리 를 재귀 적으로 스캔 하면서 즉시 첫 번째 레벨 서브 디렉토리의 */*.pyc모든 .pyc파일 을 선택합니다 **/*.pyc. 예를 들어에 foo/bar/qux.pyc의해 삭제 rm **/*.pyc되지만에 의해 삭제 되지는 않습니다 */*.pyc.

globstar 쉘 옵션이 사용 가능해야합니다. 사용하려면 globstar:

shopt -s globstar

상태를 확인하려면

shopt globstar

1
달리기 rm **/*.pyc대 차이점은 무엇입니까 rm */*.pyc? (후자는 로컬에서 나를 위해 일하는 것처럼 보였다.)
Taylor Edmiston

1
@TaylorEdmiston rm */*.pyc.pyc심도 1의 모든 서브 디렉토리에있는 rm **/*.pyc모든 .pyc파일을 삭제합니다. 심도 0+의 모든 서브 디렉토리에있는 모든 파일을 삭제합니다
Adam Stewart

@AdamStewart 이것을 추가해 주셔서 감사합니다. 이 스레드에 걸림돌 다른 사람을 위해, 내가 경험 한 문제는 OS X와 함께 제공되는 애플의 bash는하지 않는 (그래서 globstar를 포함하는 것이였다 **역할을 *대신 실행 및 실행 때 shopt globstar오류가 발생합니다).
Taylor Edmiston 2016 년

30

나는 그 별칭을 사용했다.

$ which pycclean

pycclean is aliased to `find . -name "*.pyc" | xargs -I {} rm -v "{}"'

12
현재 데비안에서는 pyclean입니다.
jb.

7
이것은 파일 이름의 공백을 잘 처리하지 못합니다. 당신은 사용해야 find -print0하고 xargs -0대신.
r3m0t

2
파일 / 폴더 이름에 공백이있는 파이썬 코드를 원하는 이유는 무엇입니까? 그것이 문법적으로 합법적입니까?
coredumperror

@CoreDumpError, 예, 사실 Windows Python에서는 공백이있는 디렉토리 ( "프로그램 파일")에 설치됩니다.
Paul Draper 2016 년

파이썬 인터프리터는 기본적으로 설치 될 수 있지만 코드 를 넣는 것은 쉽지 않습니다 . 또한 Program Files 폴더가 패키지 구조의 일부가되기를 원하지 않기 때문에 구문에주의를 기울였습니다.
coredumperror 2018 년

24

Windows 사용자의 경우 :

del /S *.pyc

이것을 배치 스크립트에 넣으면 일이 쉬워집니다. 감사.
Nick Gotch

Powershell을 사용하는 경우 "cmd"-> Run command-> "exit"와 함께 사용할 수 있습니다.
np8

18
find . -name '*.pyc' -print0 | xargs -0 rm

찾기는 * .pyc 파일을 재귀 적으로 찾습니다. xargs는 해당 이름 목록을 가져 와서 rm으로 보냅니다. -print0 및 -0은 파일 이름을 널 문자로 분리하도록 두 명령에 지시합니다. 따라서 공백이 포함 된 파일 이름 및 줄 바꿈이 포함 된 파일 이름에서도 올바르게 작동 할 수 있습니다.

-exec를 사용한 솔루션은 작동하지만 모든 파일에 대해 새로운 rm 복사본을 스핀 업합니다. 시스템 속도가 느리거나 파일이 많은 경우 시간이 너무 오래 걸립니다.

몇 가지 인수를 추가 할 수도 있습니다.

find . -iname '*.pyc' -print0 | xargs -0 --no-run-if-empty  rm

iname은 * .PYC와 같이 대소 문자를 구분하지 않습니다. no-run-if-empty는 그러한 파일이없는 경우 rm에서 오류가 발생하지 않도록합니다.


16
$ find . -name '*.pyc' -delete

이보다 빠릅니다

$ find . -name "*.pyc" -exec rm -rf {} \;

11

또한 사람들은 일반적으로 현재 디렉토리에서 모든 *.pyc, *.pyo파일 및 __pycache__디렉토리를 재귀 적 으로 제거하려고합니다 .

명령:

find . | grep -E "(__pycache__|\.pyc|\.pyo$)" | xargs rm -rf

이것은 좋은 대답이지만, 평범한 파이썬 솔루션은 크로스 플랫폼이므로 바람직합니다. 개인적으로, 나는 아마 반 Windows에서 파이썬 인구의 삶의 윈도우 신경 쓰지 않지만 - 그리고 find, grep친구가 작동하지 않습니다.
Peterino

툴링을 설치하면 수행됩니다. 크로스 윈도우를 용이하게하기 위해 모든 CLI 사용자가 그렇게하는 것이 좋습니다 : superuser.com/questions/168202/…
DylanYoung

8

믹스에 다른 변형을 던지기 위해 다음과 같이 역 따옴표를 사용할 수도 있습니다.

rm `find . -name *.pyc`

5
일치하는 인수가 너무 많으면 전달할 인수가 너무 많으므로 실패에 약간의 단점이 있습니다 rm.
chepner


7

완전 재귀

ll **/**/*.pyc
rm **/**/*.pyc

흥미로운 점은 이것이 앤디와 빌의 답변과 어떻게 비교됩니까?
Austin Henley

3
한 세트 **는 중복되며, d0k대답 과 마찬가지로 bash 4 이상에서 globstar를 활성화해야 의도 한대로 작동합니다. 즉 shopt -s globstar, 소스 bash 중 하나에서 수행 하거나 가지고 있습니다. 파일.
Monica Reinstate Please Please

1
또한 ll일반적으로와 같은 별칭이 ls -l있지만 실제로 명령이나 이식성이 아닙니다. 따라서에 모든 .pyc파일 을 재귀 적으로 나열 .하려면 대신 echo **/*.pycglobstar를 사용하도록 설정해야합니다.
복원 Monica Monica

3

첫 실행 :

find . -type f -name "*.py[c|o]" -exec rm -f {} +

그런 다음 다음을 추가하십시오.

export PYTHONDONTWRITEBYTECODE=1

~ / .profile


3

더 이상 .pyc를 원하지 않으면 터미널에서이 단일 행을 사용할 수 있습니다.

export PYTHONDONTWRITEBYTECODE=1

마음이 바뀌면

unset PYTHONDONTWRITEBYTECODE

2

rm -r디렉토리로 돌아가지만 사용자가 제공 한 디렉토리 만 rm. 해당 디렉토리도 삭제됩니다. 한 가지 해결책은 다음과 같습니다.

for i in $( find . -name *.pyc )
do
  rm $i
done

find현재 디렉토리에서 모든 * .pyc 파일을 재귀 적으로 찾고 for루프는 찾은 파일 목록을 반복하여 각 파일을 제거합니다.


이 파일은 .sh 파일에 넣고 실행해야합니다. (이 명령은 두 번 이상 사용할 것입니다)
Teifion

나는 ';'으로 구분 된 한 줄에 모든 것을 넣으면 쉘에서 실행할 수 있다고 생각합니다. 내가 bash는 것을 입력 할 때, 마지막에 "완료"에 대한 bash는 대기 ... 아무것도 실행하기
크리스 루츠에게

그것은 끔찍한 반 패턴입니다 (그리고 매우 일반적인 것도 사라질 수 있기를 바랍니다) : 공백이나 glob 문자를 포함하는 파일 이름으로 중단됩니다. 그리고 그것은 지점 그리워 find그와 -exec술어 : find . -name '*.pyc' -exec rm {} +(친절, 짧은, 안전, 강력한, 더 효율적으로).
gniourf_gniourf


1

당신은 실행할 수 있습니다 find . -name "*.pyc" -type f -delete.

그러나 예방 조치와 함께 사용하십시오. 먼저 find . -name "*.pyc" -type f어떤 파일을 제거할지 정확히 확인하십시오.

또한 -delete가 명령의 마지막 인수인지 확인하십시오. -name * .pyc 인수 앞에 놓으면 모든 것이 삭제됩니다.


1

프로젝트 폴더에서 모든 .pyc 파일을 삭제하려는 경우.

첫째, 당신은

cd <path/to/the/folder>

그런 다음 모든 .pyc 파일을 찾아 삭제하십시오.

find . -name \*.pyc -delete
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.