나는 다음 명령을 사용하고 있습니다 :
find . | awk 'function base(f){sub(".*/", "", f); return f;} \
{print length(base($0)), $0}'| sort -nr | head -2
파일 이름이 너무 긴 일부 파일을 찾을 수 있지만 전부는 찾을 수 없으며 삭제하지 않습니다.
이를 수행하려면 어떤 명령을 사용할 수 있습니까?
답변1
GNU가 있는 경우 find
정규식을 사용하여 주어진 길이보다 이름이 긴 파일을 찾을 수 있습니다. 예를 들어, 다음은 이름이 20자 이상인 파일을 찾습니다.
find . -regextype egrep -regex '.*/[^/]{20,}$'
다음을 추가하여 이러한 파일을 삭제할 수 있습니다 -delete
.
find . -regextype egrep -regex '.*/[^/]{20,}$' -print -delete
GNU가 없으면 다음을 find
계산할 수 있습니다 ?
.
find . -name '????????????????????*'
다음을 사용하여 파일을 삭제하십시오 -exec rm
.
find . -name '????????????????????*' -type f -print -exec rm {} +
-type f
파일만 일치하는지 확인하고 가능한 한 많은 파일을 한 번에 실행하도록 -exec rm {} +
지시하십시오 . 또는 유형에 관계없이 모든 콘텐츠를 제거하려면 다음을 사용하세요.find
rm
find . -name '????????????????????*' -print -exec rm -rf {} +
시리즈를 구성하려면 ?
다음을 사용할 수 있습니다.
printf '%20s*' | tr ' ' '?'
(20자)이므로
find . -name "$(printf '%20s*' | tr ' ' '?')" -print -exec rm -rf {} +
답변2
42자를 초과하는 파일 이름을 제거하려면 find
및 사용 :Perl
max=42
find . -print0 | perl -0sne 'unlink if length > $max' -- -max=$((max-2))
에서 perldoc -f unlink
:
unlink는 파일 목록을 삭제합니다. 성공하면 성공적으로 삭제된 파일 수를 반환합니다. 실패하면 false를 반환하고 $!(오류 번호)를 설정합니다.
주의해서 사용하세요! 좋은 디렉터리에 있지 않으면 전체 시스템을 파괴할 수 있습니다.
리더는 ./
2명의 캐릭터가 필요합니다. 그래서 -2
쉘에서 뺄셈을 합니다.