web-dev-qa-db-ja.com

いくつかを除いてディレクトリ内のすべてのファイルを削除するにはどうすればいいですか?

ディレクトリ内のすべてのファイルを削除する必要がありますが、それらの一部を除外してください。たとえば、ファイルa b c ... zがあるディレクトリで、upを除くすべてを削除する必要があります。これを行う簡単な方法はありますか?

123
Ashot

そのような場合に私がすることはタイプすることです

rm *

それから私は押す Ctrl+X* 表示されているすべてのファイル名に展開*を付けます。

それから、リストから保存したい2つのファイルを削除して、最後にコマンドラインを実行します。

109
Der Hochstapler

Bashのu,pを除くすべてのrmに、次のように入力します。

rm !(u|p)

これには、次のオプションを設定する必要があります。

shopt -s extglob

もっと見る: glob - グレッグのWiki

144
sparkie

findを使うことができます

find . ! -name u ! -name p -maxdepth 1 -type f -delete
  • !は次の式を否定します
  • -nameはファイル名を指定します
  • -maxdepth 1はfindプロセスを指定されたディレクトリのみにします(デフォルトでfindはディレクトリを行き来します)
  • -type fはファイルのみを処理します(ディレクトリなどは対象外)
  • -deleteはファイルを削除します

それから findのmanページ を見て条件を調整することができます

更新

  • 式の要素の順序は重要です(ドキュメントを参照)。
  • -printの代わりに-deleteを使用して、最初にコマンドをテストしてください。

    find . ! -name u ! -name p -maxdepth 1 -type f -print
    
71
Matteo

シンプル:

mvは上のディレクトリに欲しいファイル、rmはディレクトリ、そしてmvそれらを元に戻します。

43
user176581

this answer に多少似ていますが、特別なオプションは必要ありません。私が知っている限りでは、(古くからの)/ bin/shはShellに似ています。 (bash、zsh、kshなど)

rm [^up]
15
hlovdal

見つけることなくそれを行う:

ls | grep -v '(u|p)' | xargs rm

(編集: "u"と "v"は、他の場所と同様に、正規表現全体の一般的なバージョンとして使用されています。明らかに、正規表現を固定して、多すぎるものを避けてください。)

他の人が示唆しているように、あなたがこれの多くをやろうとしているなら、あなたは間違いなくスクリプトが欲しいと思うでしょう。

11
tquid

Zshの場合:

setopt extended_glob  # probably in your .zshrc

それから

rm ^(u|p)

または

rm *~(u|p)

2つ目は履歴置換のために^$histcharsがあってもうまくいきます、そしてもちろん~の前に任意のグロブを置くことができます。

6
poolie

GLOBIGNOREはコロンで区切られたリストを取ります

GLOBIGNORE=u:p
rm *
5
W_Whalley

フロッピー時代に戻って、私は物事を一時的にカレントディレクトリから移動させてコマンドを実行する "Except"と呼ばれるdos実行可能ファイルを持っていました。

* .txt del *。*以外の

テキストファイル以外のすべてを削除します。

これはシェルスクリプトとして実装するのはかなり簡単なことであり、これが2回以上実行される可能性がある種類のものであれば、それは良い考えのように思えます。

3
Bill K
 find . -maxdepth 1 ! -name "u" ! -name "p" -type f -exec rm -rf {} \;

これは、unixのuとp以外のすべてのファイルを削除します。

3
user1803687

本格的な正規表現emacs、posix-awk、またはposix拡張スタイル(任意の複雑な除外ファイル名にまたがる)で任意の複雑な除外パターンを指定したい場合(find manページを参照)、これをお勧めします。この例では、現在のディレクトリのupは除外されます。これはスクリプトには便利かもしれません。

find -regextype posix-awk ! -regex './(u|p)' -print0 | xargs -0 rm -rf
2
sparkie

もう一つ:

for FILE in ./*; do if [[ $FILE != ./u* ]] || [[ $FILE != ./p* ]];then rm $FILE; fi; done;

それはちょっと長いので、あなたがそれを簡単にそして任意の数の引数を収容することができる関数にそれを作ることができるかどうか私にはわかりません、しかしそれはうまくいきます。

そしてそれは純粋なbashの良さです。

1
dylnmc

つかいます:

find . -type f ! -name 'u' ! -name 'p' ! -name '*.ext' -delete
find . -type d ! -name 'u' ! -name 'p' ! -name '*.ext' -delete

u、p、および.extファイルを除く、ディレクトリを含むすべてのファイルを削除するため。

1
Renzo Fabián

これは別の変種です。あなたが入力することができます:

rm -i *

または

rm --interactive *

それでrmはあなたに各ファイルの削除を確認するように頼みます。

1
idzikovsky

xargsを使ったさらに別のバージョン:

ls -1 | grep -v do_not_delete | xargs -I files rm "files"

スペースを含むファイル名を正しく処理するにはxargs -Iが必要です。

1
sebhofer

私はいつも使う:

rm [a-o,q-t,v-z]*

これにより、粒度を細かくすることができます。それで、あなたがaからoとZファイルを削除したいならば、あなたは使うことができます:

rm [a-o,z]*
1
J Baron

めちゃくちゃにしにくい簡単な方法:* .pdf以外のすべてを削除したいとしましょう。

mkdir tmp
mv *.pdf tmp
rm *
mv tmp/* .
rm -r tmp
0
talloaktrees