답변:
cd <the directory you want>
find . -type f ! -iname "*.pdf" -delete
.pdf
filename으로 끝나는 파일을 제외한 모든 파일을 삭제합니다.예를 들어, temp
홈 폴더에 디렉토리가있는 경우 :
cd ~/temp
그런 다음 파일을 삭제하십시오.
find . -type f ! -iname "*.pdf" -delete
를 제외한 모든 파일이 삭제됩니다 xyz.pdf
.
이 두 명령을 결합하여 다음을 수행 할 수 있습니다.
find ~/temp -type f ! -iname "*.pdf" -delete
.
현재 디렉토리입니다. 끝에 !
있는 파일을 제외한 모든 파일을 가져 오는 것을 의미합니다 .pdf
. -type f
디렉토리가 아닌 파일 만 선택합니다. -delete
삭제하는 것을 의미합니다.
!
전에 와야합니다 -name
. 단순히 -name
에만 포함됩니다 .pdf
동안 -iname
모두 포함 .pdf
하고.PDF
하위 디렉토리가 아닌 현재 디렉토리에서만 삭제하려면 -maxdepth 1
다음을 추가하십시오 .
find . -maxdepth 1 -type f ! -iname "*.pdf" -delete
.
현재 디렉토리를 의미합니다. 끝에 !
있는 파일을 제외한 모든 파일을 가져 오는 것을 의미합니다 .pdf
. -delete
삭제하는 것을 의미합니다. 지금은 분명합니까?
-maxdepth 1
시작할 매개 변수를 포함해야합니다 . 그런 다음 재귀 적으로 삭제하려는 경우 매개 변수를 제거하는 것이 좋습니다.
로 bash
'확장 된 쉘 대체 (globbing)을이야, 당신은 이외의 확장명을 가진 파일을 제거 할 수 .pdf
사용
rm -- *.!(pdf)
@pts에서 언급했듯이 --
문자는 명령 옵션의 끝을 나타내며 이름이 -
문자로 시작하는 파일의 경우 드물게 명령을 안전하게 만듭니다 .
.pdf
@DennisWilliamson이 지적한 것처럼 확장자가없는 파일과 확장자가 아닌 파일을 삭제하려면 다음을 사용할 수 있습니다
rm -- !(*.pdf)
확장 글 로빙은 기본적으로 사용하도록 설정되어 있지만 사용하지 않는 경우에는
shopt -s extglob
특히 스크립트 내에서 이것을 사용하려는 경우 표현식이 어떤 것과도 일치하지 않으면 (즉, 디렉토리에 pdf 파일이 아닌 파일이없는 경우) 기본적으로 glob가 확장되지 않은 상태로 전달됩니다. rm
명령, 같은 오류가 발생
rm: cannot remove `*.!(pdf)': No such file or directory
nullglob
쉘 옵션을 사용하여이 기본 동작을 수정할 수 있지만 자체 문제가 있습니다. 더 철저한 토론은 NullGlob-Greg 's Wiki를 참조하십시오.
rm *~*.pdf
!(*.py)
합니다. 또한 OP에서 ".pdf"파일 만 남길 원하는 경우 확장명이없는 파일도 삭제하고 무시해서는 안됩니다.
가장 쉬운 방법 : 어딘가에 다른 디렉토리를 작성하십시오 (재귀 적으로 하나의 디렉토리에서만 삭제하는 경우 하위 디렉토리 일 수도 있음). 모든 .pdf를 그곳으로 옮기십시오. 다른 모든 것을 삭제하십시오. PDF를 뒤로 이동하십시오. 중간 디렉토리를 삭제하십시오.
빠르고 쉬운 작업을 정확하게 볼 수 있습니다. 중간 디렉토리가 정리중인 디렉토리와 동일한 장치에 있는지 확인하여 이동이 사본이 아닌 이름을 바꿉니다!
삭제하려는 파일 만 표시 한 다음를 rm
사용하여 전송하는 방법을 작성하면 매우주의를 기울일 수 있기 때문에 내가 좋아하는 접근 방식이 있습니다 xargs
. 예를 들면 다음과 같습니다.
ls
나에게 모든 것을 보여줘ls | grep pdf
보관하고 싶은 파일을 보여줍니다. 흠.ls | grep -v pdf
내가 지키고 싶은 것을 제외한 모든 것이 반대 입니다. 즉, 삭제하려는 항목의 목록이 표시됩니다. 위험한 일을하기 전에 이것을 확인할 수 있습니다.ls | grep -v pdf | xargs rm
rm
삭제 를 위해 해당 목록을 정확하게 보냅니다.내가 말했듯이, 나는 주로 그것이 제공하는 안전을 위해 이것을 좋아합니다 rm *
. 다른 두 가지 장점 :
ls
또는 find
당신이 선호로, 초기 목록을 얻을 수 있습니다. 그 목록을 좁히는 과정에서 다른 것 grep
, 다른 것 awk
, 또는 무엇이든 원하는 것을 사용할 수 있습니다. 이름에 색상이 포함 된 파일 만 삭제해야한다면 같은 방식으로 만들 수 있습니다.find
찾기와 rm
제거 에 사용하는 것을 선호합니다 . 이 작업을 다시 수행하면 대체 솔루션을 작성할 수 있습니다. 대신에 파일을 휴지통으로 옮기고 ( "삭제 취소"대신) 파이프를 대신 하는 명령을 작성할 수 있습니다 . 해당 옵션 을 지원할 필요는 없으며 파이프로 연결하면됩니다.find
-delete
rm
trash
rm
find
파일 이름의 줄 바꿈, 파일 이름 등의 일부 경우를 처리하도록 수정하는 방법은 @pabouk의 주석을 참조하십시오 my_pdfs.zip
.
pdf
이름에 포함 된 파일은 제외합니다 . --- b) 접미사에있는 문자가 대문자이면 PDF 파일을 삭제합니다. --- c)의 출력을 사용하는 것은 좋지 않습니다 ls
. 개행을 포함하는 파일 이름에는 작동하지 않습니다. ls
특수 문자 를 대체하는 일부 구현 ( 예 : tab by) ?
. --- 사용하는 것이 좋습니다 : find -maxdepth 1 -print0
. (너무 짧게하지 ls
: -----를 해결하려면)와 b)의 사용 grep -vi '\.pdf$'
: --- 전체 (그러나 GNU 전용) 솔루션find -maxdepth 1 -print0 | grep -viz '\.pdf$' | xargs -0 rm
| head -20
적어도 그것이 대략적 으로 보이는지 알 수 있지만, 그렇지 않으면 rm my_pattern
큰 실수를 발견 할 기회가 없습니다.
find . -type f ! -name "*.pdf"
콘솔로 인쇄하거나 파일을 적거나 적은 파일로 파이프하는 데 사용할 수 있습니다. [그리고 pabouk의 주석처럼 원한다면 xargs로 rm으로 파이프 (이상한 파일 이름의 경우 -print0 | ... -0로)]
나는 일반적으로 대화 형 파이썬 인터프리터에서 이러한 문제를 해결합니다.
mic@mic ~ $ python
>>> import os
>>> for f in os.listdir('.'):
... if not f.endswith('.pdf'):
... os.remove(f)
그것은과 한 줄 이상 수 있습니다 find
또는 xargs
, 그러나 먼저 조회하지 않고, 그것은 매우 탄력, 그리고 내가 무슨 일을하는지 정확히 알지.
for item in [f for f in os.listdir('.') if not f.endswith('.pdf')]: os.remove(item)
python -c "import os; for f in os.listdir('.'): if not f.endswith('.pdf'): os.remove(f)"
[os.remove(f) for f in os.listdir('.') if not f.endswith('.pdf')]
이 질문에 대한 더 나은 답변 (이전 답변과 비교)은 강력한 file
명령 을 사용하는 것 입니다.
$ file -i abc.pdf
abc: application/pdf; charset=binary
이제 당신의 문제 :
cd <the directory you want to search in>
for var in ./*
do
if file -i "$var" | grep -q 'application/pdf\;'
then
echo "$var"
fi
done
for
명령 작업은 현재 디렉토리의 파일을 variable 형식으로 제공합니다 $var
. if-then
명령은 0
from file -i "$var" | grep -q 'application/pdf\;'
명령 의 종료 상태를 가져 와서 pdf 파일의 이름을 출력하며 pdf 파일을 0
찾은 경우에만 종료 상태를 제공 합니다.
rm $(ls -lo|grep -v [Pp][Dd][Ff]$|awk '{print $7}')
경고! 더 나은 시도 먼저
ls -l $(ls -lo|grep -v [Pp][Dd][Ff]$|awk '{print $7}')
-i
와 함께 사용해야합니다 grep
.
rm -i -- !(*@(a|x).pdf)
로 읽 a.pdf
거나 아닌 파일을 모두 제거하십시오 x.pdf
.
이 2 확장 globs와 이용하여 작동, 외부는 !()
자체가 작은 방울 중 하나 이상 일치해야 필요 포함 된 글로브 부정 a
또는 x
전과 패턴 .pdf
접미사. glob # extglob를 참조하십시오 .
$ ls -a
.dotfile1 .dotfile2 a.pdf x.pdf y.zip z.mp3
$ echo -- !(a.pdf)
-- x.pdf y.zip z.mp3
$ echo -- !(x.pdf)
-- a.pdf y.zip z.mp3
$ echo -- !(a.pdf|x.pdf)
-- y.zip z.mp3
$ echo -- !(@(a|x).pdf) # NOTE.that this matches the .dotfiles* as well
-- . .. .dotfile1 .dotfile2 y.zip z.mp3
$ echo -- !(*@(a|x).pdf) # but this doesn't
-- y.zip z.mp3
$ echo rm -i -- !(*@(a|x).pdf)
rm -i -- y.zip z.mp3
$ ksh -c 'for i in ./*; do case $i in *.pdf)continue;; *)rm "$i";; esac;done'
어떤 Bourne의 스타일 쉘 거의 POSIX 호환 ( ksh
, bash
, dash
). 휴대용 스크립트 및 bash
확장 쉘 글 로빙을 사용할 수없는 경우에 적합합니다 .
$ perl -le 'opendir(my $d,"."); foreach my $f (grep(-f && !/.pdf/ , readdir($d))){unlink $f};closedir $d'
또는 약간 더 깨끗합니다 :
$ perl -le 'opendir(my $d,"."); map{ unlink $_ } grep(-f "./$_" && !/.pdf/ , readdir($d));closedir $d'
python -c 'import os;map(lambda x: os.remove(x), filter(lambda x: not x.endswith(".pdf"),os.listdir(".")))'
삭제하는 내용에주의하십시오!
ls
포착되지 않은 동작으로 인해 원치 않는 파일이 삭제 될 수 있으므로 삭제하기 전에 먼저 테스트하는 것이 안전 합니다. 디렉토리 외부에서 직접 수행 할 수 있습니다. ls
와 비슷합니다 rm
.
ls sub/path/to/files/!(*.pdf)
이것은 나열됩니다
y.zip
z.mp3
이제 삭제중인 내용을보고 안전하게 삭제할 수 있습니다.
rm sub/path/to/files/!(*.pdf)
그리고 그게 다야. *
프로그래밍 과정 문서 만 유지하는 것처럼 와일드 카드 를 사용 하여보다 선택적으로 사용할 수 있습니다 .
rm sub/path/to/files/!(*programming*)
.
"and"를 의미합니까?!
"제외"-name
는 이름 매개 변수로 제외하려는 것을 의미-delete
하며 찾기시 수행해야하는 조치입니까? "* .pdf"를 제외한 모든 것을 찾아서 삭제합니까? 아니면 내가 잘못 이해 했습니까?