Linux의 Bash에서 한 번에 여러 파일을 삭제하는 방법은 무엇입니까?


103

Linux 서버에 다음 파일 목록이 있습니다.

abc.log.2012-03-14
abc.log.2012-03-27
abc.log.2012-03-28
abc.log.2012-03-29
abc.log.2012-03-30
abc.log.2012-04-02
abc.log.2012-04-04
abc.log.2012-04-05
abc.log.2012-04-09
abc.log.2012-04-10

rm -rf아래 명령을 사용하여 선택한 로그 파일을 하나씩 삭제했습니다 .

rm -rf abc.log.2012-03-14
rm -rf abc.log.2012-03-27
rm -rf abc.log.2012-03-28

선택한 파일을 한 번에 삭제할 수있는 다른 방법이 있습니까?


4
그리고 "GNU / Linux라고 말하세요. Linux뿐만 아니라", 뒷좌석에서 누군가 천둥 소리를 듣습니다.
Boris Stitnicky

8
그건 그렇고, 왜 tthe -rf? 이 폴더입니까? f는 강제, r은 재귀입니다. 파일 만 있으면 작동하지만 경고를 받으면 무언가를 삭제할 때마다 -rf를 사용하는 것은 매우 (매우) (매우) 위험합니다. ( "linux"가 너무 넓기 때문에 "bash"태그를 추가해야합니다.
Depado

@BorisStitnicky-왜 GNU필요한지 궁금 합니다.
user66001 2013-09-04

2
@ user66001 : 문제에 대한 GNU 프로젝트의 의견 : gnu.org/gnu/linux-and-gnu.html . 나는이 문제에 대해 적어도 여기서는 입장을 취하지 않으며, 여기에서 토론 할 곳 이 아닙니다 .
Keith Thompson

2
@BorisStitnicky - 아니오 논쟁 필요가 전혀 몰랐죠, 그 링크는 나에게 내가 일을 찾고 있던 정보 수준 준
user66001

답변:


159

Bash는 모든 종류의 와일드 카드 및 확장을 지원합니다.

정확한 케이스는 다음 과 같이 중괄호 확장 으로 처리됩니다 .

$ rm -rf abc.log.2012-03-{14,27,28}

위의 내용은 세 개의 인수가 모두 포함 된 단일 명령으로 확장되며 다음을 입력하는 것과 같습니다.

$ rm -rf abc.log.2012-03-14 abc.log.2012-03-27 abc.log.2012-03-28

이 확장은 rm로드 되기 전에 쉘에 의해 수행된다는 점에 유의하는 것이 중요합니다 .


나중에 파일을 복원하려면 "rm"을 사용하지 마십시오. "rm-trash"유틸리티를 사용할 수 있습니다. github.com/nateshmbhat/rm-trash
Natesh bhat

75

*여러 파일을 일치 시키려면 와일드 카드 ( )를 사용하십시오 .

예를 들어, 아래 명령은 이름이 abc.log.2012-03-.

rm -f abc.log.2012-03-*

명령을 ls abc.log.2012-03-*실행하기 전에 삭제할 내용을 볼 수 있도록 파일을 나열하기 위해 실행 하는 것이 좋습니다 rm.

자세한 내용은 파일 이름 확장 에 대한 Bash 매뉴얼 페이지를 참조하십시오 .


매우 유용하지만 삭제 확인을 요청하지 않습니다. 주의하십시오.
nuriselcuk

1
@nuriselcuk 삭제되는 각 파일에 대한 확인을 위해 -i를 추가 할 수 있습니다.
Felipe Romero

Amazon Linux를 실행하는 AWS Ec2-Instance에서 매력처럼 작동했습니다. 1 :) 감사합니다.
Kyle Bridenstine

41

이름이 특정 형식과 일치하는 모든 파일을 삭제하려는 경우 와일드 카드 (glob 패턴)가 가장 간단한 솔루션입니다. 몇 가지 예 :

$ rm -f abc.log.*             # Remove them all
$ rm -f abc.log.2012*         # Remove all logs from 2012
$ rm -f abc.log.2012-0[123]*  # Remove all files from the first quarter of 2012

정규식은 와일드 카드보다 강력합니다. 의 출력 greprm -f. 파일 이름의 일부와 함께 시작하는 경우 예를 들어, "abc.log"그리고 일부는 "ABC.log", grep할 수 있습니다 당신은 대소 문자를 구분 일치를 수행합니다

$ rm -f $(ls | grep -i '^abc\.log\.')

파일 이름에 공백을 포함하여 재미있는 문자가 포함되어 있으면 문제가 발생합니다. 조심해.

이 작업을 수행 할 때 ls | grep ...먼저 명령을 실행하고 원하는 출력을 생성하는지 확인합니다. 특히 다음을 사용하는 경우 rm -f:

$ ls | grep -i '^abc\.log\.'
(check that the list is correct)
$ rm -f $(!!)

여기서는 !!이전 명령으로 확장됩니다. 또는 위쪽 화살표 또는 Ctrl-P를 입력하고 이전 줄을 편집하여 rm -f명령 을 추가 할 수 있습니다 .

이것은 bash 셸을 사용하고 있다고 가정합니다. 일부 다른 쉘, 특히 csh 및 tcsh 및 일부 이전 sh 파생 쉘은 $(...)구문을 지원하지 않을 수 있습니다 . 동등한 백틱 구문을 사용할 수 있습니다.

$ rm -f `ls | grep -i '^abc\.log\.'`

$(...)구문은 읽기 쉽게, 그리고 당신이 정말로 야심이 있다면 그것은 중첩 될 수 있습니다.

마지막으로 삭제하려는 파일의 하위 집합을 정규식으로 쉽게 표현할 수없는 경우 자주 사용하는 트릭은 파일을 임시 텍스트 파일에 나열한 다음 편집하는 것입니다.

$ ls > list
$ vi list   # Use your favorite text editor

그런 다음 list파일을 수동으로 편집하고 제거 할 파일 만 남겨두고 다음을 수행 할 수 있습니다 .

$ rm -f $(<list)

또는

$ rm -f `cat list`

(다시 말하지만 이것은 파일 이름에 재미있는 문자, 특히 공백이 포함되어 있지 않다고 가정합니다.)

또는 list파일을 편집 할 때 rm -f 각 줄의 시작 부분에 추가 한 다음 다음을 수행 할 수 있습니다 .

$ . ./list

또는

$ source ./list

파일을 편집하면 필요한 변경 예를 들어, 따옴표를 추가 할 수있는 기회 rm -f foo barrm -f 'foo bar'.


8

숭고한 여러 줄 선택을 사용하여 모든 파일을 한 줄로 결합하고 각 파일 이름 사이에 공백을 추가 한 다음 rm목록 시작 부분에 추가 하십시오. 삭제하려는 파일 이름에 패턴이 없을 때 가장 유용합니다.

[$]> rm abc.log.2012-03-14 abc.log.2012-03-27 abc.log.2012-03-28 abc.log.2012-03-29 abc.log.2012-03-30 abc.log.2012-04-02 abc.log.2012-04-04 abc.log.2012-04-05 abc.log.2012-04-09 abc.log.2012-04-10

이것은 제기 된 질문에 명시 적으로 대답하므로 허용되는 대답이어야합니다. Google에서 온 사람들에게 더 친절합니다.
ATLief

5

와일드 카드는이를 위해 잘 작동하지만 안전하기 위해서는 와일드 카드를 가능한 한 최소화하는 것이 가장 좋습니다.

rm -rf abc.log.2012-*

보기에는 파일이 하나뿐입니까? 재귀 옵션은 해당 항목이 디렉토리가 아닌 경우 필요하지 않으므로 안전을 위해 사용하지 않는 것이 가장 좋습니다.


2

나는 리눅스 전문가는 아니지만 출력 파일 목록을 xargs rm -rf. 나는 과거에 좋은 결과로 이와 같은 것을 사용했습니다. 먼저 샘플 디렉토리에서 테스트하십시오!

편집-나타나는 다른 답변을 기반으로 오해했을 수 있습니다. 와일드 카드를 사용할 수 있다면 좋습니다. 표시 한 원본 목록은 "선택"을 제공하는 프로그램에 의해 생성 된 것으로 가정했기 때문에 파이핑 xargs이 갈 길이 라고 생각했습니다 .


-1

디렉토리에 속한 모든 파일을 한 번에 삭제하려면. 예 : 디렉토리 이름은 "log"이고 "log"디렉토리에는 abc.log.2012-03-14, abc.log.2012-03-15 등의 파일이 포함됩니다. 로그 디렉토리 위에 있어야하며 :

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