![ディレクトリ内の拡張子がpdfのファイルを除くすべてのファイルを削除します](https://rvso.com/image/977075/%E3%83%87%E3%82%A3%E3%83%AC%E3%82%AF%E3%83%88%E3%83%AA%E5%86%85%E3%81%AE%E6%8B%A1%E5%BC%B5%E5%AD%90%E3%81%8Cpdf%E3%81%AE%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%92%E9%99%A4%E3%81%8F%E3%81%99%E3%81%B9%E3%81%A6%E3%81%AE%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%92%E5%89%8A%E9%99%A4%E3%81%97%E3%81%BE%E3%81%99.png)
次の内容を含むディレクトリがあります:
x.pdf
y.zip
z.mp3
a.pdf
x.pdf
とを除くすべてのファイルを削除したいのですa.pdf
が、ターミナルからこれを実行するにはどうすればよいですか? サブディレクトリがないため、再帰は必要ありません。
答え1
cd <the directory you want>
find . -type f ! -iname "*.pdf" -delete
- 最初のコマンドは、ファイルを削除したいディレクトリに移動します。
.pdf
2番目のコマンドは、ファイル名がで終わるファイルを除くすべてのファイルを削除します。
たとえば、temp
ホーム フォルダーに次のディレクトリがある場合:
cd ~/temp
次にファイルを削除します:
find . -type f ! -iname "*.pdf" -delete
これにより、 を除くすべてのファイルが削除されますxyz.pdf
。
これら 2 つのコマンドを組み合わせると、次のことが可能になります。
find ~/temp -type f ! -iname "*.pdf" -delete
.
は現在のディレクトリです。末尾に が!
付いているファイルを除くすべてのファイルを取得することを意味します。ディレクトリではなくファイルのみを選択します。削除することを意味します。.pdf
-type f
-delete
注意: このコマンドは、現在のディレクトリとすべてのサブディレクトリにあるすべてのファイル (PDF ファイルを除く、隠しファイルを含む) を削除します。!
は の前に来なければなりません-name
。 は-name
のみを含みます.pdf
が、 はと の-iname
両方を含みます。.pdf
.PDF
現在のディレクトリのみを削除し、サブディレクトリは削除しない場合は、次を追加します-maxdepth 1
:
find . -maxdepth 1 -type f ! -iname "*.pdf" -delete
答え2
の拡張シェルグロビングを使用すると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 - グレッグのウィキ
答え3
$ cd <the directory you want>
$ gvfs-trash !(*.pdf)
またはmv
コマンドで(ただし、この方法では.trashinfo情報が記録されないためゴミ箱から復元することはできません。つまり、ファイルを別の場所に移動したことになります。行き先以下に示すとおりです。
mv !(*.pdf) ~/.local/share/Trash/files
答え4
bash の GLOBIGNORE を使用します:
GLOBIGNORE=x.pdf:a.pdf
rm *
unset GLOBIGNORE
bash のマニュアルページより:
グロビニョーレ: セットを定義するパターンのコロンで区切られたリスト パス名展開で無視されるファイル名。
簡単なテスト:
mkdir /tmp/foooooo
cd /tmp/foooooo
touch x.pdf y.zip z.mp3 a.pdf
GLOBIGNORE=x.pdf:a.pdf
ls -1 *
出力:
y.zip mp3 の