ls를 grep으로 파이프하고 grep으로 필터링 된 파일을 삭제하려면 어떻게합니까?


33

홈 파일에서 일부 패키지를 삭제하고 싶지만 파일 이름이 너무 깁니다 ( google-chrome-stable_current_i386.deb). 그래서 명령을 사용하여 ls|grep chrome|rm파일을 grep하여 파이프하여 크롬 파일을 필터링 한 다음 제거하기로 결정했습니다. 작동하지 않았으므로 어떻게 할 수 있는지 알고 싶습니다.


22
rm -i *chrome*.deb
Lambert

28
일반적으로 사람들이 "하지 마십시오"라는 답변을 게시 할 때 싫어하지만 이것은 내가 본 XY 문제 의 가장 좋은 예 중 하나입니다 . 당신의 실제 질문은 "모든 것을 입력하지 않고 긴 파일 이름을 가진 파일을 어떻게 빨리 삭제합니까?"이며, 출력을 grepping하지 않는 좋은 방법이 많이 있습니다.ls
Michael Mrozek

5
find-를 사용하십시오 find . -name "*chrome*" -delete.
거미 보리스


3
StackExchange 사용자로서의 2 센트 : 나중에 시도한 내용에 대한 세부 정보를 제공하면서보다 일반적인 방식으로 질문하십시오. "파일 이름에 특정 문자열이있는 폴더의 파일을 어떻게 삭제합니까?" 그것을 표현하는 더 좋은 방법 일 수 있습니다. 그럼 당신은 단순히 당신이 배관을 시도하는 것이, 여담으로, 추가 할 수 있습니다 ls통해 greprm있지만 작업에 가져올 수 없습니다. 그렇게하면 비효율적 인 솔루션에 대해 누군가에게 당신에게 좋은 대답을하도록 강요하는 대신, 당신의 과제를 완수하는 "올바른"또는 "가장 쉬운"방법에 대한 좋은 대답을 얻을 수있을 것입니다.
Adrian

답변:


56

이것은 거의 나를 wince하게했다.

  1. 샷건 을 당신의 발로 향하는 것을 멈추고 싶을 수도 있습니다 . 기본적으로 모든 종류의 구문 분석은 또는 globs 와 같은 기존의 방법보다 ls복잡하고 오류가 발생하기 쉽습니다 .find [...] -exec
  2. 누군가 당신을 위해 트롤 배포판을 설치하지 않으면, 당신의 쉘은 Tab완성되었습니다. 입력하고을 rm google누릅니다 Tab. 즉시 완료되지 않으면 Tab다시 누르면 일치하는 파일 목록이 표시됩니다. 파일 이름의 문자를 더 입력하여 완료 될 때까지 좁힌 다음 명령을 실행하십시오.
  3. 파이프 ! = 매개 변수 . 표준 입력은 이진 데이터 스트림 으로 명령에 비동기 적으로 공급 될 수 있습니다. 매개 변수는 공백으로 구분 된 문자열로, 실행될 때 명령에 한 번만 전달됩니다. 이들은 거의 교환 할 수 없습니다.

1
n00b 질문처럼 보이면 죄송합니다. 명시된 패키지는 "크롬"이 표시된 유일한 패키지이므로 일반적으로 사용하는 것이 좋습니다. 따라서 grep을 사용하면 하나의 파일 만 필터링됩니다. 나는 리눅스를 처음 접했고 이미 많은 bash 스크립트를 수행했지만 아직 모든 것을 모른다 : P. 가혹합니다.
SpecialBomb

5
거칠다는 의미는 아니지만, 껍질은 거칠고 용서할 수없는 환경으로, 사용자 친화적 인 표면 뒤에 숨겨져 있습니다. 안전하게 일을하는 것은 충분히 어렵고, 안전 하거나 정확하게 신경 쓰지 마십시오 .
l0b0

2
@SpecialBomb 이것은 정답입니다. 다른 답변과 마찬가지로 샷건이 발을 깨끗하게 자르도록 올바르게 조준하는 방법을 설명하는 것은 확실히 방법이 아닙니다. 맹목적으로 실행하는 것에 특히주의하십시오 rm-아마도 배포판을 튀기는 가장 일반적인 방법 일 것입니다.
거미 보리스

@BoristheSpider Heh, 나는 이미 우분투를 AMD 그래픽 카드 드라이버를 두 번 설치하여 확실히 튀김했습니다. 나는 이미 그것에 대해 질문했다. AMD는 끔찍했기 때문에 AMD 카드에서 Linux를 사용하는 일반적인 수정 사항이나 더 나은 게임 방법이 있는지 물었습니다.
SpecialBomb

34

와일드 카드와 함께 find 명령을 사용할 수도 있습니다.

find . -maxdepth 1 -name '*chrome*' -delete

"-maxdepth"인수는 find가 현재 디렉토리에서만 작동하고 하위 디렉토리로 재귀하지 않도록합니다.


1
개선을위한 제안 : (a) -iname대소 문자를 구분하지 않는 파일 이름 사용 (b)에 대한 플래그 를 xargs사용 하고에 대한 플래그를 사용 합니다. 의 사용은 당신이 "대화"(확인 삭제와 같은 작업을 수행 할 수 있습니다 ?) 삭제합니다. -print0find-0xargsxargsfoo
Christopher Schultz

3
-exec 옵션을 사용하면 xargs로 파이프 할 필요가 없습니다 :find . -name '*chrome*' -exec rm -i {} +
Johnny

4
하위 디렉토리로 재귀 적으로 삭제되지 않습니까? maxdepth1 로 지정해야 할 수도 있습니다.
Tyzoid

32

당신은 옳은 생각을 가지고 있었고, 세부 사항을 놓쳤습니다. STDIN에 제공되는 목록을 처리 rm하고 매개 변수를 예상 하므로을 사용해야 xargs합니다.

그러므로:

ls | grep chrome | xargs rm

당신이 원하는 것을 주어야합니다.

chrome파일 이외의 모든 것을 삭제하려면 간단히 명령문에 추가하면 -v됩니다 grep.

이 질문에 대한 다른 답변에 따르면, 이것은 당신이 달성하고자하는 것을 성취하는 나쁜 방법 일 것입니다.


를 사용하면 일치하는 파일을 제외한-v 모든 항목이 삭제되지 않습니까? 나는 그것이 OP가 원하는 것이라고 생각하지 않습니다 ...chrome
akivajgordon

다시 보면, 맞습니다. OP는 "크롬 파일을 필터링"하고 싶지만 제거하려고합니다.
John

이것은 단순한 "rm -i chrome " 과 비교할 때 불필요하게 복잡해 보입니다.
chander

5
허용되는 답변은 효과가 있지만 아래의 답변을 참조하여 왜 나쁜 생각인지 설명하십시오. (이 의견은 "허용 된"체크 표시를 보자 마자 멈추는 사람들을 위해서만 여기에이 의견을 게시합니다.)
Jim Davis

1
이것은 출력 에 "이상한"파일 이름이없는 경우에만 "답"으로 작동 ls합니다. 공백이있는 파일 이름으로 인해 문제가 발생합니다. 누군가가 이것을 실행하는 디렉토리에 특별한 소스를 가진 파일 이름을 만들 수 있다면 이것은 위험 합니다. 여러 사람이 이미 지적 했으므로 ls의 출력을 구문 분석하지 마십시오 !
Stephen P

11

ls의 출력을 분석하지 마십시오.
제 제안은 명령 과 함께 ls [ 1 ] 의 출력을 구문 분석하지 않는 것del 입니다. 이것은 여러 가지 이유로 주로 파일 이름에 허용되지 않는 예기치 않은 문자와 관련이 있습니다.

Linux 패키지에 속하는 파일 이름이 "잘 작동" 할 것으로 예상 되더라도 다른 파일이 동일한 디렉토리에 있지만 모르거나 알지 못하는 경우이 문제가 발생할 수 있습니다.

그것은 더 나은 사용에있어 find, 탭 확장 (이름을 누르 쓰기 시작 Tab)의 파일 이름 확장 [ 2 ]*MyKey*...


빠른 솔루션 내부에 "google"이 포함 된
모든 패키지 (로 끝나는 .deb) 를 선택 하려면 와일드 카드로 요청을 작성하고 간단한 작업을 수행 할 수 있습니다.* *google*.deb

rm -i *google*.deb 

현재 디렉토리에 표시 될 중간에 "google"이 있는 각 파일 이름 을 선택합니다 . 옵션 (대화식)은 확인 메시지를 표시하며, 매개 변수 확장으로 파일을 삭제할 때 좋은 습관입니다..deb-i


당신의 시도의 철학에 대한 해결책 가까운
당신의 목적은, 조각 후 당신의 명령 줄 조각을 구축하는 작업을 완료 한 그렇다면 ls, 이후에 ls | grep google, 그리고 당신이 당신의 출력을 확인 후에 만 이 서브 쉘에서 실행할 수 $(...)

rm -i $(ls | grep google)

더 빠르고 더 위험한 방법 [ 3 ] , 사용하는 것입니다!!

ls | grep google
rm -i $(!!)

그것은 당신의 역사에서 완성 된 마지막 명령 을 실행 합니다 . 로 쉘 옵션 histverify을 미리 활성화 한 경우 실행할 행을 시각적으로 제어 할 수 없다는 사실로부터 자신을 보호 할 수 있습니다 shopt -s histverify.


5
touch 0 1 2 3 4 5 6 7 8 9
find . -name \[0-9] -ok rm {} \;

< rm ... ./0 > ? y
< rm ... ./9 > ? y
< rm ... ./8 > ? y
< rm ... ./7 > ? y
< rm ... ./6 > ? y
< rm ... ./5 > ? y
< rm ... ./4 > ? y
< rm ... ./3 > ? y
< rm ... ./2 > ? y
< rm ... ./1 > ? y
^C

... -name '*c*.deb'나에게 적합한 다른 패턴을 사용하십시오.


2

rm의 입력을 수락하지 않습니다 stdin. 당신은 뭔가를해야합니다ls google-chrome* | xargs rm

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