[linux] Linux의 Bash에서 한 번에 여러 파일을 삭제하는 방법은 무엇입니까?
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
선택한 파일을 한 번에 삭제할 수있는 다른 방법이 있습니까?
답변
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
로드 되기 전에 쉘에 의해 수행된다는 점에 유의하는 것이 중요합니다 .
답변
*
여러 파일을 일치 시키려면 와일드 카드 ( )를 사용하십시오 .
예를 들어, 아래 명령은 이름이 abc.log.2012-03-
.
rm -f abc.log.2012-03-*
명령을 ls abc.log.2012-03-*
실행하기 전에 삭제할 내용을 볼 수 있도록 파일을 나열하기 위해 실행 하는 것이 좋습니다 rm
.
자세한 내용은 파일 이름 확장 에 대한 Bash 매뉴얼 페이지를 참조하십시오 .
답변
이름이 특정 형식과 일치하는 모든 파일을 삭제하려는 경우 와일드 카드 (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
정규식은 와일드 카드보다 강력합니다. 의 출력 grep
을 rm -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 bar
에 rm -f 'foo bar'
.
답변
숭고한 여러 줄 선택을 사용하여 모든 파일을 한 줄로 결합하고 각 파일 이름 사이에 공백을 추가 한 다음 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
답변
와일드 카드는이를 위해 잘 작동하지만 안전하기 위해서는 와일드 카드를 가능한 한 최소화하는 것이 가장 좋습니다.
rm -rf abc.log.2012-*
보기에는 파일이 하나뿐입니까? 재귀 옵션은 해당 항목이 디렉토리가 아닌 경우 필요하지 않으므로 안전을 위해 사용하지 않는 것이 가장 좋습니다.
답변
나는 리눅스 전문가는 아니지만 출력 파일 목록을 xargs rm -rf
. 나는 과거에 좋은 결과로 이와 같은 것을 사용했습니다. 먼저 샘플 디렉토리에서 테스트하십시오!
편집-나타나는 다른 답변을 기반으로 오해했을 수 있습니다. 와일드 카드를 사용할 수 있다면 좋습니다. 표시 한 원본 목록은 “선택”을 제공하는 프로그램에 의해 생성 된 것으로 가정했기 때문에 파이핑 xargs
이 갈 길이 라고 생각했습니다 .
답변
디렉토리에 속한 모든 파일을 한 번에 삭제하려면. 예 : 디렉토리 이름은 “log”이고 “log”디렉토리에는 abc.log.2012-03-14, abc.log.2012-03-15 등의 파일이 포함됩니다. 로그 디렉토리 위에 있어야하며 :
rm -rf /log/*