ls grep 및 rm을 사용하여 디렉토리의 파일 삭제

ls grep 및 rm을 사용하여 디렉토리의 파일 삭제

내 프로젝트 루트에 이 줄이 포함된 bash 파일이 있습니다.

$ ls | grep -P '^some_pattern_matching_regex_goeshere.txt$' | xargs rm -f

위의 줄은 .txt프로젝트 루트에서 모든 파일을 삭제하지만 모든 .txt 파일을 다음과 같은 다른 폴더에 푸시하면프로세스 로그/동일한 명령을 사용해 보았지만 작동 ls하지 않습니다.greprm

삭제에 성공하지 못한 파일은 다음과 같습니다.프로세스 로그목차.

 $ 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끝에 있는 파일 이름 부분뿐만 아니라 전체 경로 이름과 일치합니다(이것이 경로 이름 끝에 이 표현식을 고정한 이유입니다 $). -regextypeGNU 매뉴얼 find의 옵션 도 참조하세요 .

관련 정보