ディレクトリ内のすべてのファイルを削除する必要がありますが、それらの一部を除外してください。たとえば、ファイルa b c ... z
があるディレクトリで、u
とp
を除くすべてを削除する必要があります。これを行う簡単な方法はありますか?
そのような場合に私がすることはタイプすることです
rm *
それから私は押す Ctrl+X、* 表示されているすべてのファイル名に展開*
を付けます。
それから、リストから保存したい2つのファイルを削除して、最後にコマンドラインを実行します。
Bashのu,p
を除くすべてのrm
に、次のように入力します。
rm !(u|p)
これには、次のオプションを設定する必要があります。
shopt -s extglob
もっと見る: glob - グレッグのWiki
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
シンプル:
mv
は上のディレクトリに欲しいファイル、rm
はディレクトリ、そしてmv
それらを元に戻します。
this answer に多少似ていますが、特別なオプションは必要ありません。私が知っている限りでは、(古くからの)/ bin/shはShellに似ています。 (bash、zsh、kshなど)
rm [^up]
見つけることなくそれを行う:
ls | grep -v '(u|p)' | xargs rm
(編集: "u"と "v"は、他の場所と同様に、正規表現全体の一般的なバージョンとして使用されています。明らかに、正規表現を固定して、多すぎるものを避けてください。)
他の人が示唆しているように、あなたがこれの多くをやろうとしているなら、あなたは間違いなくスクリプトが欲しいと思うでしょう。
Zshの場合:
setopt extended_glob # probably in your .zshrc
それから
rm ^(u|p)
または
rm *~(u|p)
2つ目は履歴置換のために^
に$histchars
があってもうまくいきます、そしてもちろん~
の前に任意のグロブを置くことができます。
GLOBIGNOREはコロンで区切られたリストを取ります
GLOBIGNORE=u:p
rm *
フロッピー時代に戻って、私は物事を一時的にカレントディレクトリから移動させてコマンドを実行する "Except"と呼ばれるdos実行可能ファイルを持っていました。
* .txt del *。*以外の
テキストファイル以外のすべてを削除します。
これはシェルスクリプトとして実装するのはかなり簡単なことであり、これが2回以上実行される可能性がある種類のものであれば、それは良い考えのように思えます。
find . -maxdepth 1 ! -name "u" ! -name "p" -type f -exec rm -rf {} \;
これは、unixのuとp以外のすべてのファイルを削除します。
本格的な正規表現emacs、posix-awk、またはposix拡張スタイル(任意の複雑な除外ファイル名にまたがる)で任意の複雑な除外パターンを指定したい場合(find manページを参照)、これをお勧めします。この例では、現在のディレクトリのu
とp
は除外されます。これはスクリプトには便利かもしれません。
find -regextype posix-awk ! -regex './(u|p)' -print0 | xargs -0 rm -rf
もう一つ:
for FILE in ./*; do if [[ $FILE != ./u* ]] || [[ $FILE != ./p* ]];then rm $FILE; fi; done;
それはちょっと長いので、あなたがそれを簡単にそして任意の数の引数を収容することができる関数にそれを作ることができるかどうか私にはわかりません、しかしそれはうまくいきます。
そしてそれは純粋なbashの良さです。
つかいます:
find . -type f ! -name 'u' ! -name 'p' ! -name '*.ext' -delete
find . -type d ! -name 'u' ! -name 'p' ! -name '*.ext' -delete
u、p、および.extファイルを除く、ディレクトリを含むすべてのファイルを削除するため。
これは別の変種です。あなたが入力することができます:
rm -i *
または
rm --interactive *
それでrm
はあなたに各ファイルの削除を確認するように頼みます。
xargs
を使ったさらに別のバージョン:
ls -1 | grep -v do_not_delete | xargs -I files rm "files"
スペースを含むファイル名を正しく処理するにはxargs -I
が必要です。
私はいつも使う:
rm [a-o,q-t,v-z]*
これにより、粒度を細かくすることができます。それで、あなたがaからoとZファイルを削除したいならば、あなたは使うことができます:
rm [a-o,z]*
めちゃくちゃにしにくい簡単な方法:* .pdf以外のすべてを削除したいとしましょう。
mkdir tmp
mv *.pdf tmp
rm *
mv tmp/* .
rm -r tmp