回答:
cd <the directory you want>
find . -type f ! -iname "*.pdf" -delete
.pdf
、ファイル名で終わるファイルを除くすべてのファイルを削除しますたとえばtemp
、ホームフォルダーに呼び出されるディレクトリがある場合:
cd ~/temp
その後、ファイルを削除します。
find . -type f ! -iname "*.pdf" -delete
これにより、を除くすべてのファイルが削除されますxyz.pdf
。
これら2つのコマンドを組み合わせて、次のことができます。
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
拡張シェルグロブ、あなたは以外の拡張子を持つすべてのファイルを削除することもできます.pdf
使用して
rm -- *.!(pdf)
@ptsで述べたように、--
文字はコマンドオプションの終わりを示し、ファイルが文字で始まるまれな場合にコマンドを安全にします-
。
拡張子のないファイルと拡張子が以外のファイルを削除する場合は.pdf
、@ DennisWilliamsonが指摘したように、
rm -- !(*.pdf)
拡張グロビングはデフォルトで有効にする必要がありますが、そうでない場合は次を使用して有効にすることができます
shopt -s extglob
特にスクリプト内でこれを使用する場合、式が何にも一致しない場合(つまり、ディレクトリに非pdfファイルがない場合)、デフォルトではグロブが展開されずに渡されることに注意することが重要ですrm
次のようなエラーが発生するコマンド
rm: cannot remove `*.!(pdf)': No such file or directory
nullglob
シェルオプションを使用してこのデフォルトの動作を変更できますが、独自の問題があります。より詳細な議論については、NullGlob-Greg's Wikiを参照してください
rm *~*.pdf
!(*.py)
。また、おそらく、OPが ".pdf"ファイルのみを残したい場合は、拡張子のないファイルも削除して無視しないでください。
最も簡単な方法:別のディレクトリをどこかに作成します(再帰的にではなく、1つのディレクトリのみを削除する場合は、サブディレクトリでもかまいません)。すべての.pdfをそこに移動します。他のすべてを削除します。PDFを戻します。中間ディレクトリを削除します。
素早く、簡単に、あなたがやっていることを正確に見ることができます。中間ディレクトリがクリーンアップするディレクトリと同じデバイス上にあることを確認してください。そうすれば、移動はコピーではなく名前変更になります。
私がとても気をつけてくれるので、私が好きなアプローチがあります:削除したいファイルだけを表示する方法を作成し、それをrm
使用して送信しますxargs
。例えば:
ls
すべてを見せてくれますls | grep pdf
保持したいファイルを表示します。うーん。ls | grep -v pdf
反対を示しています:私が保持したいものを除くすべて。つまり、削除したいもののリストが表示されます。危険なことをする前にこれを確認できます。ls | grep -v pdf | xargs rm
そのリストをrm
削除のために正確に送信します私が言ったように、私は主にそれが提供する安全性のためにこれが好きです:rm *
私にとって偶然ではありません。他の2つの利点:
ls
またはfind
を使用して、必要に応じて初期リストを取得できます。リストを絞り込むプロセスでは、別のgrep
ものawk
、別のもの、その他何でも使用できます。名前に色が含まれているファイルのみを削除する必要がある場合は、同じ方法で作成できます。find
検索とrm
削除に使用することを好みます。また、これを行うと、別のソリューションを作成できます。多分代わりに、ファイルをゴミ箱に移動するコマンドを作成して(「削除」を許可)、代わりにそのファイルにパイプすることができます。そのオプションをサポートする必要はなく、単にパイプするだけです。find
-delete
rm
trash
rm
find
@paboukによるコメントを参照して、ファイル名の改行、などのファイル名など、エッジケースを処理するためにこれを変更する方法を確認してくださいmy_pdfs.zip
。
pdf
名前に任意の場所を含むファイルを除外します。--- b)接尾辞の文字のいずれかが大文字の場合、PDFファイルを削除します。--- c)の出力を使用するのは得策ではありませんls
。改行を含むファイル名では機能しません。の一部の実装はls
、特殊文字を置き換える(例:タブ)?
。---使用することをお勧めします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"
コンソールへの印刷、またはlessまたはファイルへのパイプに使用することができます。[そして、必要に応じてpaboukのコメントのようにxargsにパイプして(奇妙なファイル名には-print0 | ... -0を使用)]
私は通常、対話型Pythonインタープリターからこのような問題を解決します。
mic@mic ~ $ python
>>> import os
>>> for f in os.listdir('.'):
... if not f.endswith('.pdf'):
... os.remove(f)
find
またはの付いた1ライナーよりも長い場合がありますが、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
コマンドの仕事は、変数の形式で現在のディレクトリ内のファイルを与えることです$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つの拡張グロブを利用することによって、この作品は、外側は!()
それ自体がグロブは、以上のいずれかと一致しなければならないことを必要含まグロブ否定する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'
かなり多くの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)
以上です。Yoはワイルドカード*
を使用して、プログラミングコースドキュメントのみを保持するように、より選択的にすることができます。
rm sub/path/to/files/!(*programming*)
.
「と」を意味する?!
「-name
除外」は、名前パラメータで除外することを意味し-delete
、検索時に実行するアクションですか?「* .pdf」以外のすべてを探して削除しますか?または私は誤解しましたか?