명령 행 : 배관 찾기 결과를 rm으로


140

15 일보다 오래된 SQL 파일을 삭제하는 명령을 해결하려고합니다.

찾기 부분이 작동하지만 rm이 아닙니다.

rm -f | find -L /usr/www2/bar/htdocs/foo/rsync/httpdocs/db_backups -type f  \( -name '*.sql' \) -mtime +15

삭제하려는 파일의 목록을 쫓아 내지 만 삭제하지는 않습니다. 경로가 정확합니다.

usage: rm [-f | -i] [-dIPRrvW] file ...
       unlink file
/usr/www2/bar/htdocs/foo/rsync/httpdocs/db_backups/20120601.backup.sql
...
/usr/www2/bar/htdocs/foo/rsync/httpdocs/db_backups/20120610.backup.sql

내가 뭘 잘못하고 있죠?

답변:


274

당신은 실제로 배관된다 rm출력 의 입력에 find. 당신이 원하는 것은의 출력을 사용하는 find등의 인수 로를 rm:

find -type f -name '*.sql' -mtime +15 | xargs rm

xargs표준 입력을 다른 프로그램의 인수로 "변환"하거나 man페이지 에보다 정확하게 입력 할 수있는 명령입니다 .

표준 입력에서 명령 행 작성 및 실행

파일 이름에 공백 문자가 포함될 수 있으면 다음을 수정해야합니다.

find -type f -name '*.sql' -mtime +15 -print0 | xargs -0 rm

그러나 실제로 find이것에 대한 지름길이 있습니다 : -delete옵션 :

find -type f -name '*.sql' -mtime +15 -delete

다음과 같은 경고에 유의하십시오 man find.

  Warnings:  Don't  forget that the find command line is evaluated
  as an expression, so putting -delete first will make find try to
  delete everything below the starting points you specified.  When
  testing a find command line that you later intend  to  use  with
  -delete,  you should explicitly specify -depth in order to avoid
  later surprises.  Because -delete  implies  -depth,  you  cannot
  usefully use -prune and -delete together.

PS 표준 입력에서 파일 이름을 기대하지 않기 rm때문에 직접 파이핑 하는 것은 옵션 rm이 아닙니다. 현재하고있는 일은 뒤로 파이핑하는 것입니다.


1
감사. 맨 페이지를 읽고 그 깃발을 시험해 보았습니다. 전체 경로를 전달하고 있지만 "/ usr / www2 / bar / htdocs / foo / rsync / httpdocs / db_backups / : 상대 경로가 안전하지 않을 수 있습니다." 왜 그런지 알아?
jerrygarciuh 2016 년


감사. 확실하게 게시물을 잘 모르겠지만 솔루션을 에뮬레이션하고 명령 끝에 -delete를 넣으면 모드 시간에 관계없이 모든 SQL 파일이 삭제되었지만 경고가 없으므로 경고가 없었습니다. 진행 상황 ...
jerrygarciuh

1
@jerrygarciuh 흠, 나는 가치있는 것이 잃어 버리지 않기를 바란다 ... man말한다 : When testing a find command line that you later intend to use with -delete, you should explicitly specify -depth in order to avoid later surprises.나는 당신이 사용한 다른 옵션을 고려할 때 그것이 어떻게 중요한지 잘 모르겠지만 그것을 시도 했습니까?
Lev Levitsky 2016 년

아니에요. 그러나 아무것도 잃어 버렸습니다. 이 파일들은 다른 서버와도 동기화되어 저장됩니다.
jerrygarciuh

26
find /usr/www/bar/htdocs -mtime +15 -exec rm {} \;

/usr/www/bar/htdocs15 일이 지난 파일을 선택 하여 제거합니다.


"이름에 공백"으로 인해 허용 된 것보다 귀하의 답변을 선호합니다. 파이프보다 "-exec"명령으로 처리하는 것이 좋습니다. 감사.
슬림 알루이

3

또 다른 간단한 방법은 locate명령 을 사용하는 것 입니다. 그런 다음 결과를로 파이프하십시오 xargs.

예를 들어

locate file | xargs rm

2

* .sql 백업 파일이있는 디렉토리에 있지 않다고 가정합니다.

find /usr/www2/bar/htdocs/foo/rsync/httpdocs/db_backups/*.sql -mtime +15 -exec rm -v {} \;

위의 -v 옵션은 삭제 될 때 삭제중인 파일을 자세하게 출력합니다.

먼저 삭제 될 파일을 나열하고 싶습니다. 예 :

find /usr/www2/bar/htdocs/foo/rsync/httpdocs/db_backups/*.sql -mtime +15 -exec ls -lrth {} \;
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.