program tip

디렉토리가 아닌 Linux의 디렉토리에있는 파일 만 제거

radiobox 2020. 12. 29. 06:56
반응형

디렉토리가 아닌 Linux의 디렉토리에있는 파일 만 제거


주어진 디렉토리의 파일 만 제거하기 위해 실행할 수있는 삭제 명령

  • NOT 디렉토리
  • 아님 하위 디렉토리
  • 이 하위 디렉토리의 파일이 아닙니다.

일부 파일에는 확장자가 없으므로 rm *.*작동 하지 않습니다 .

이 폴더에는 수천 개의 파일이 있습니다.

어떤 충고?


findwith -type f는 파일에만 사용할 수 -maxdepth 1있으므로의 find하위 디렉토리에있는 파일은 검색하지 않습니다 /path/to/directory. rm -i삭제할 때마다 메시지가 표시되므로 삭제를 확인하거나 거부 할 수 있습니다. 각 삭제의 확인 요청을 받고 걱정 해달라고 경우에 변경 rm -fv( -f대한 강제 삭제). -v플래그는 각각의 삭제와 함께 메시지가 파일을 그냥 삭제 무슨 말을 인쇄 있도록한다.

find /path/to/directory -maxdepth 1 -type f -exec rm -iv {} \;

다음 기준을 충족해야합니다.

디렉토리가
아닙니다. 하위 디렉토리가
아닙니다. 이러한 하위 디렉토리의 파일이 아닙니다.


find PATH -maxdepth 1 -type f -delete

그러나 이것은 확인을 요청하거나 방금 삭제 한 내용을 출력하지 않습니다. 따라서 먼저 -delete 작업없이 실행하고 올바른 파일인지 확인하는 것이 가장 좋습니다.


이것은 Google 검색에서 높기 때문에 가장 간단한 대답은 다음과 같습니다.

rm $directoryPath/*

여기서 $ directoryPath는 비 우려는 디렉토리입니다. 크레딧은 cbm3384로 이동해야합니다 (어떤 이유로이 답변에 대해 부정적인 투표를 받았는데 그 이유는 무엇입니까?)

확인을 원하지 않는 경우 :

rm -f $directoryPath/*

믿지 않는다면 시도 man rm하거나

mkdir -p 1/2/3; echo 'hello1' > 1/hello1.txt; echo 'hello2' > 1/2/hello2.txt;echo 'hello3' > 1/2/3/hello3.txt
rm 1/2/*

위는 각 폴더에 'helloX.txt'가있는 디렉터리 구조를 만듭니다 (X는 디렉터리 수준). 다른 구조를 rm 1/2/*삭제 hello2.txt하고 그대로 둡니다.

또한 rm */*/*만 삭제합니다 hello2.txt. 패턴과 일치하는 유일한 것입니다.

cakephp tmp-directory를 정리하고 디렉토리 구조를 그대로 유지하는 Makefile의 예입니다.

clean:
    -rm -f tmp/*
    -rm -f tmp/*/*
    -rm -f tmp/*/*/*
    -rm -f tmp/*/*/*/*

마이너스는 rm"오류시 중단하지 않음"을 의미합니다 (제거되지 않은 디렉토리는 오류를 반환 함). 어떤 레벨을 저장하려면 해당 라인을 제거하십시오. 예를 들어 두 번째 rm 라인은 로그를 제거합니다.

다른 작업을 수행하는 시스템 (BSD?)이 있으면 알려주세요.

편집 : 나는 우분투 12.04, osx lion 및 sourceforge.net 셸에서 이것을 테스트했습니다. 모두 위의 설명처럼 작동합니다.


rm기본적으로 디렉토리를 삭제하지 않습니다. 따라서 귀하의 예 에서 부모 디렉토리에 있고 모든 파일 이 있다고 가정 하면 필요한 것은 다음과 같습니다.

rm *

TL; DR :

find . -maxdepth 1 -type f -delete

기타:

큰 문제는 아니지만 위의 제안은 저에게 효과적이지 않았습니다.

find . -type f -maxdepth 1 -delete

find : 경고 : 옵션이 아닌 인수 -type 뒤에 -maxdepth 옵션을 지정했지만 옵션은 위치가 아닙니다 (-maxdepth는 이전에 지정된 테스트와 그 뒤에 지정된 테스트에 영향을 미칩니다). 다른 인수 앞에 옵션을 지정하십시오.


rm dirname/*? 없이는 -f강제로 삭제 -r되지 않으며 파일뿐만 아니라 디렉토리도 재귀 및 삭제하지 않습니다.


rm -f dirname/*각 파일에 대한 메시지를 표시하지 않고 파일 만 제거합니다. 또한 "Cannnot remove 'subdirname': Is a directory"각 하위 디렉토리에 대해 표시됩니다 .


이를 위해 최대 깊이가 1 인 find를 사용하고 파일 목록과 함께 exec rm을 사용합니다.

find ./dir -maxdepth 1 -type f -exec rm -rf '{}' \;

편집 : 이것은 본질적으로 James가 게시 한 것과 동일하지만 이후까지 그의 게시물을 보지 못했습니다.


나를 위해 일한 것은 PERL 스크립트입니다.

perl -e 'chdir "subdirectory_name" or die; opendir D, "."; while ($n = readdir D) { unlink $n }'

Run this one level up from the directory you wish to clean: replace "subdirectory_name" with the directories name.

Worked on millions of files without killing the CPU.

ReferenceURL : https://stackoverflow.com/questions/7714900/remove-only-files-in-directory-on-linux-not-directories

반응형