재귀 적으로 파일 제거


140

Mac에서 Linux 서버로 파일을 옮긴 후에 얻는 성가신 ._ 및 .DS_Store 파일을 제거하는 솔루션이 있습니까?

시작 디렉토리를 지정하고 그대로 두시겠습니까? / var / www / html / down ...처럼


중복 IMO는 아니지만 이것을 살펴보아야합니다. stackoverflow.com/questions/1280429/…
Grundlefleck

당신이 요구하는 것은 아니지만. 나는 이것이 더 나은 해결책이라고 주장 할 것이다 : unix.stackexchange.com/questions/9665/…
Viktor

답변:


169

디렉토리로 변경하고 다음을 사용하십시오.

find . -name ".DS_Store" -print0 | xargs -0 rm -rf
find . -name "._*" -print0 | xargs -0 rm -rf

테스트되지 않았으므로 먼저 xargs없이 시도하십시오!

먼저 디렉토리로 변경하는 대신 찾기 후 마침표를 디렉토리로 바꿀 수 있습니다.

find /dir/here ...

2
나는 그의 질문이 그것을 요구하지 않았다는 것을 알고 있지만 결코 기억할 수 없다 : 당신의 예는 공백이있는 파일 이름을 처리합니까?
Grundlefleck

4
그렇습니다. print0과 -0에서 xargs까지입니다. 일반적으로 공백을 올바르게 처리하지는 않지만 print0을 사용하면 줄 끝에서 null 문자로 파일 이름을 인쇄합니다. -0을 사용하는 xarg는 공백이 없어도 xargs에 전체 경로를 전달하는 데 사용됩니다. rm 명령에 두 번째 또는 세 번째 매개 변수를 사용하면 실제로 나쁠 수 있습니다!
X-Istence

7
@X : 최신 findutils는 -delete이를 줄일 수 있는 작업을 지원합니다 . @JT : 아래에서 재귀 적으로 검색 .합니다. 파일과 하위 디렉토리의 수에 따라 ... 업로드하는 것을 금지 할 수는 없습니까?
ephemient

1
은 Using -r당신이 어떤 디렉토리를 삭제하지 않기 때문에 (순환) 플래그 것은 ..이 경우에는 사용하지 않는 것이 좋습니다
다니엘 하르에게

2
@IlmariKaronen : 좋은 지적입니다. 하지 않을까요 command rm더 나은 (, 더 직접) 솔루션을 수? ( "직접"으로 말하면 현재 당면한 문제를 다루고 다른 것을 다루지 않으므로 원치 않는 부작용이 발생할 가능성이 적으며 코드를 유지 해야하는 사람에게는 더 설명이 필요합니다. 나중에.)
iconoclast

93
find /var/www/html \( -name '.DS_Store' -or -name '._*' \) -delete

86

최근 findutils의 지원 -delete, 그래서 :

find . -name ".DS_Store" -delete

-print삭제 목록을 얻으려면 추가하십시오 .

최신 POSIX 시스템을 보유하고 있다면 명령이 도움이 될 것입니다. 적어도 그것은 OS X 10.8에서 나를 위해 작동하고 macOS 10.12 (Mojave)에서 그것을 테스트 한 다른 사람들에게 작동합니다.

@ X-Istence의 게시물에 대한 의견에서 @ephemient에게 감사드립니다.


1
OSX 10.6에서도 작동합니다.
hoss

3
가장 깨끗하고 간단한 솔루션, +1!
limist

6
@OneOfOne : 내 의견에서 알 수 있듯이 @ ephemient에서 얻었습니다. bash 초보자에게는 귀하의 (아마도 더 정확한) 솔루션이 훨씬 덜 읽기 쉽고 유용하다는 것을 알았습니다. 그것들은 기능적으로 동일 할 수 있지만이 구문이 더 명확하다는 것을 알았습니다.
rattray

1
'.' find기본적으로 현재 작업 디렉토리로 되풀이 되므로 필요하지 않습니다 .
Tom Russell

최신 버전의 프로그램에서는 디렉토리가 생략 될 수 있으며 현재 작업중인 디렉토리 ( wikipedia )를 의미합니다 . .macOS 10.12 (Sierra)에는 여전히 필요 합니다.
Dem Pilafian

18

간단한 명령 :

rm `find ./ -name '.DS_Store'` -rf
rm `find ./ -name '._'` -rf

행운을 빕니다!


1
이것은 잘 작동합니다. 그러나 조심스럽게 한마디 로이 rm -i 찾기를 사용했습니다 ./ -name '* py'` -rf , which did NOT prompt me to delete files. you will need to take it on the end (i.e. -rfi`). 백업 스크립트를 주셔서 감사합니다.
ryanjdillon

1
파일이 너무 많으면 오류와 함께 중단됩니다.-bash: /bin/rm: Argument list too long
Viktor

12
cd /var/www/html && find . -name '.DS_Store' -print0 | xargs -0 rm
cd /var/www/html && find . -name '._*' -print0 | xargs -0 rm

2
"rm"에는이 특정 작업에 필요하지 않은 "-r"이 없기 때문에이 방법을 더 좋아했습니다.
lotsoffreetime

6

bash 대신 zsh로 전환 할 수 있습니다. **를 사용하면 디렉토리 트리의 어느 곳에서나 파일을 일치시킬 수 있습니다.

$ rm /var/www/html/**/_* /var/www/html/**/.DS_Store

다음과 같이 결합 할 수도 있습니다.

$ rm /var/www/html/**/(_*|.DS_Store)

Zsh에는 bash가 부족한 많은 다른 기능이 있지만 그중 하나만으로도 가치가 있습니다. cygwin 및 OS X뿐만 아니라 대부분의 (아마도 모든) Linux 배포판에서 사용할 수 있습니다.

zsh 사이트 에서 자세한 정보를 찾을 수 있습니다 .


1
가능한 문제 : xargs를 사용하지 않기 때문에 명령 행 인수 길이 제한이 발생할 수 있습니다. 또한 Bash 4도 지원합니다 **:-) (기본적 shopt -s globstar으로 설정 되어 있지는 않지만 설정해야 함)
ephemient

4
find . -name "FILE-TO-FIND"-exec rm -rf {} \;

발견 된 각 파일에 대해 exec를 사용하는 것은 빠르지 않습니다. 출력물을 찾은 다음 xargs를 사용하여 rm을 한 번 호출하는 것이 더 빠릅니다.
X-Istence

3
당신이있는 경우에는 find그 지원을, +: xargs를 같은있다 find . -name "FILE-TO-FIND" -exec rm -rf {} +(또한, 당신은 공간 이전이 누락 - -exec)
일시 중지 추후 공지가있을 때까지합니다.

3
우리는 내 하루에 xargs를 한 적이 없습니다. 그리고 우리는 학교로 걸어 가야했고, 오르막 길을 .......
Martin Beckett

3

"Thumbs.db"를 재귀 적으로 삭제하는 예;

find . -iname "Thumbs.db" -print0 | xargs -0 rm -rf

다음으로 확인하십시오.

find . -iname "Thumbs.db"

현재 경로 안에 "Thumbs.db"가있는 항목은 표시되지 않습니다.


삭제되는 무슨의 목록 답을 인쇄해야하고 누군가가 사용하고자하는 이유를 설명해주십시오 xargsprint0대신 exec(이유가).
Josh Habdas


2

Bash 4.0 ++이 있다면

#!/bin/bash
shopt -s globstar
for file in /var/www/html/**/.DS_Store /var/www/html/**/._ 
do
 echo rm "$file"
done

2
각 파일에 대해 새로운 rm 복사본을 실행하는 것은 낭비입니다.
X-Istence

2
@ X-Istence 조기 최적화는 낭비입니다
Lucina

독창성과 최신 bash 혁신 기술을 사용하기로했습니다.
Josh Habdas

1

몇 가지 참고할 사항 :

'-delete'는 재귀 적이 지 않습니다. 따라서 .TemporaryItems (폴더)에 파일이 있으면 명령이 실패합니다.

macs에서 생성 한 성가신 파일이 많이 있습니다. .DS_Store ._. DS_Store .TemporaryItems .apdisk

이 하나의 명령은 모든 것을 다룹니다. 여러 개의 일치 항목에 대해 찾기 실행을 반복하여 저장하지 않습니다.

find /home/foo \( -name '.DS_Store' -or -name '._.DS_Store' -or -name '._*' -or -name '.TemporaryItems' -or -name '.apdisk' \) -exec rm -rf {} \;

0

이것은 또한 작동합니다 :

sudo rm -rf 2018-03-*

여기에 형식이 2018-03-03 인 파일을 삭제하십시오 (다른 것)

단순하게 유지


누군가가 명령에 접두사를 붙이고 싶을 때 설명하지 않으며 답의 맥락에서 sudo어떻게 rm작동하는지에 대한 정보를 제공하지 않습니다 .
Josh Habdas
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.