1つのディレクトリを除くすべてのファイルを見つける

1つのディレクトリを除くすべてのファイルを見つける

だから、作業を始める前にディレクトリを整理したいと思います。私はちょっとこんな感じです。

./static
├── css
│   └── styles
├── img
│   └── pictures
└── js
    └── scripts

私はrmの内容が欲しいが望んでいません。cssjsimg

両方のパスを入れることができることを知っていますが、それは面倒でこの方法を試しましたが、成功しませんでした。

rm -r ./static/{css,js}/*

rm: './static/{css,js}/*' を削除できません。そのファイルやディレクトリはありません。

これを行う方法についてのアイデアはありますか?

答え1

*あなたのコマンドはファイルとして扱われます。試してみてください。rm -rf ./static/{css,js}/

代わりに、Bash拡張ワイルドカード(最初にテストした後に削除echo):

$ shopt -s extglob
$ cd static
$ echo rm -rf !(img)

または 短い答え

ls | grep -v "img" | xargs rm -rf

コメントでOPが提案したように、この手順に従って作業を完了してください。まず、ファイルを印刷してテストを実行して、必要なものを入手したことを確認してください。

$ find . -path ./img -prune -o -type f
./css/styles
./img
./js/scripts

確認後削除してください。

$ find . -path ./img -prune -o -type f -exec rm {} \;

$ static/
  ├── css
  ├── img
  │   └── pictures
  └── js

答え2

findちょっと長いですが、具体的に言いたいときはいつも好きです。これにより構造が保存され、imgディレクトリは無視されます。

find ./static -type d ! -name 'img' -exec rm -f {}/* \;

何が起こっているのか分析

find注文する

./static検索場所の指定

type -dディレクトリの選択

! -name 'img'img ディレクトリを無視

-exec rm -f {}/* \:'が{}見つかったディレクトリ名に変わり、コマンドが実行されます。

関連情報