상당히 큰 프로젝트에서 일부 파일의 이름을 바꾸고 남은 .pyc 파일을 제거하고 싶습니다. bash 스크립트를 시도했습니다.
rm -r *.pyc
그러나 그것은 내가 생각했던 것처럼 폴더를 통해 재귀되지 않습니다. 내가 무엇을 잘못하고 있지?
**/*.pyc
하면 다시 걱정할 필요가 없습니다.
상당히 큰 프로젝트에서 일부 파일의 이름을 바꾸고 남은 .pyc 파일을 제거하고 싶습니다. bash 스크립트를 시도했습니다.
rm -r *.pyc
그러나 그것은 내가 생각했던 것처럼 폴더를 통해 재귀되지 않습니다. 내가 무엇을 잘못하고 있지?
**/*.pyc
하면 다시 걱정할 필요가 없습니다.
답변:
find . -name "*.pyc" -exec rm -f {} \;
find . -name \*.pyc -delete
{}
. 실수로 단어를 분리하여 찾은 경로의 일부처럼 호출되는 중간 경로를 삭제하면 어떻게됩니까?
-delete
는 POSIX 사양의 일부가 아니며의 모든 구현에 존재한다고 보장되지는 않습니다 find
.
find . -name '*.pyc' -delete
확실히 가장 간단합니다.
find
지원 -delete
; POSIX 표준의 일부가 아닙니다.
__pycache__
디렉토리 는 무시합니다 . 내 대답을 참조하십시오.
-name '*.py?'
포함.pyo, .pyc,...
데비안의 현재 버전에는 패키지에 있는 pyclean
스크립트가 python-minimal
있습니다.
사용법은 간단합니다.
pyclean .
에 추가 ~/.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
그 문제를 해결해야합니다.
bash> = 4.0 (또는 zsh)을 사용하는 경우
rm **/*.pyc
전체 디렉토리 트리 를 재귀 적으로 스캔 하면서 즉시 첫 번째 레벨 서브 디렉토리의 */*.pyc
모든 .pyc
파일 을 선택합니다 **/*.pyc
. 예를 들어에 foo/bar/qux.pyc
의해 삭제 rm **/*.pyc
되지만에 의해 삭제 되지는 않습니다 */*.pyc
.
globstar 쉘 옵션이 사용 가능해야합니다. 사용하려면 globstar
:
shopt -s globstar
상태를 확인하려면
shopt globstar
rm **/*.pyc
대 차이점은 무엇입니까 rm */*.pyc
? (후자는 로컬에서 나를 위해 일하는 것처럼 보였다.)
rm */*.pyc
은 .pyc
심도 1의 모든 서브 디렉토리에있는 rm **/*.pyc
모든 .pyc
파일을 삭제합니다. 심도 0+의 모든 서브 디렉토리에있는 모든 파일을 삭제합니다
**
역할을 *
대신 실행 및 실행 때 shopt globstar
오류가 발생합니다).
나는 그 별칭을 사용했다.
$ which pycclean
pycclean is aliased to `find . -name "*.pyc" | xargs -I {} rm -v "{}"'
find -print0
하고 xargs -0
대신.
Windows 사용자의 경우 :
del /S *.pyc
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에서 오류가 발생하지 않도록합니다.
또한 사람들은 일반적으로 현재 디렉토리에서 모든 *.pyc
, *.pyo
파일 및 __pycache__
디렉토리를 재귀 적 으로 제거하려고합니다 .
명령:
find . | grep -E "(__pycache__|\.pyc|\.pyo$)" | xargs rm -rf
find
, grep
친구가 작동하지 않습니다.
참고 :이 답변은 이미 Django Extension을 사용하고있는 Django 프로젝트 에만 해당됩니다 .
python manage.py clean_pyc
구현은 소스 코드 에서 볼 수 있습니다 .
완전 재귀
ll **/**/*.pyc
rm **/**/*.pyc
**
는 중복되며, d0k
대답 과 마찬가지로 bash 4 이상에서 globstar를 활성화해야 의도 한대로 작동합니다. 즉 shopt -s globstar
, 소스 bash 중 하나에서 수행 하거나 가지고 있습니다. 파일.
ll
일반적으로와 같은 별칭이 ls -l
있지만 실제로 명령이나 이식성이 아닙니다. 따라서에 모든 .pyc
파일 을 재귀 적으로 나열 .
하려면 대신 echo **/*.pyc
globstar를 사용하도록 설정해야합니다.
rm -r
디렉토리로 돌아가지만 사용자가 제공 한 디렉토리 만 rm
. 해당 디렉토리도 삭제됩니다. 한 가지 해결책은 다음과 같습니다.
for i in $( find . -name *.pyc )
do
rm $i
done
find
현재 디렉토리에서 모든 * .pyc 파일을 재귀 적으로 찾고 for
루프는 찾은 파일 목록을 반복하여 각 파일을 제거합니다.
find
그와 -exec
술어 : find . -name '*.pyc' -exec rm {} +
(친절, 짧은, 안전, 강력한, 더 효율적으로).
rm
가 인수 [-r, a.pyc, b.pyc]와 함께 호출됩니다.