내 프로젝트 루트에 이 줄이 포함된 bash 파일이 있습니다.
$ ls | grep -P '^some_pattern_matching_regex_goeshere.txt$' | xargs rm -f
위의 줄은 .txt
프로젝트 루트에서 모든 파일을 삭제하지만 모든 .txt 파일을 다음과 같은 다른 폴더에 푸시하면프로세스 로그/동일한 명령을 사용해 보았지만 작동 ls
하지 않습니다.grep
rm
삭제에 성공하지 못한 파일은 다음과 같습니다.프로세스 로그목차.
$ ls process_logs/ | grep -P '^some_pattern_matching_regex_goeshere.txt$' | xargs rm -f
알아채다:디렉토리에서 파일을 삭제하는 것과 같은 간단한 정규식 패턴을 사용하여 명령을 시도했지만
ls process_logs/ | grep -P '^*.txt$' | xargs rm -f
작동하지 않습니다.
답변1
find
대안을 사용해 보세요 . 재귀 를 원하지 않으면 find
깊이 옵션을 사용할 수 있습니다.
find /process_logs -maxdepth 1 -mindepth 1 -type f -name 'some_shell_glob_pattern_here' -delete
ls
구문 분석된 출력은 사람이 읽을 수 있는 인쇄된 파일 이름 버전이 실제 파일 이름과 일치하지 않을 수 있으므로 ls
항상 정확하지는 않으므로 권장되지 않습니다 . ls
자세한 내용은 다음을 참조하세요.ls를 구문 분석하다위키 기사.
답변2
나는 동의한다find를 사용하는 것이 더 나은 선택입니다.. 하지만 귀하의 명령이 작동하지 않는 이유를 추가하고 싶습니다.
당신의 명령:
$ ls process_logs/ | grep -P '^some_pattern_matching_regex_goeshere.txt$' | xargs rm -f
ls
출력 파일 이름길이 없다. 하지만 경로를 추가하지 않았습니다 rm
. 따라서 현재/루트 디렉토리의 하위 디렉토리에서 파일 이름을 제거하려고 시도합니다.
노력하다
$ cd process_logs/; ls | grep -P '^some_pattern_matching_regex_goeshere.txt$' | xargs rm -f
또는
$ ls process_logs/ | grep -P '^some_pattern_matching_regex_goeshere.txt$' | xargs -i rm -f "process_logs/{}"
답변3
간단한 쉘 파일 이름 글로빙 패턴이 있는 경우 이를 사용하십시오.
예를 들어 ( *
보다 정확한 패턴으로 대체될 수 있음)
rm -f process_logs/*.txt
또는 수십만 개의 파일이 있는 경우 다음을 사용하십시오 xargs
.
printf '%s\0' process_logs/*.txt | xargs -0 rm -f
만약 당신이 절대적으로필요정규식을 사용하기 위해 GNU는 다음을 find
사용할 수 있습니다 .
find process_logs -maxdepth 1 -type f -regex '\.txt$' -delete
조건자는 -regex
끝에 있는 파일 이름 부분뿐만 아니라 전체 경로 이름과 일치합니다(이것이 경로 이름 끝에 이 표현식을 고정한 이유입니다 $
). -regextype
GNU 매뉴얼 find
의 옵션 도 참조하세요 .