web-dev-qa-db-ja.com

1つとその子孫を除くすべてのディレクトリを親ディレクトリ内から削除します

directory structure

ディレクトリBとDを削除したい。しかし、Cとそのすべての子孫ファイルとディレクトリを保持したい。 1つのディレクトリとその子を除く、親ディレクトリのすべての子ディレクトリを削除するコマンドは何ですか。

感謝します。

8
Joe Saad

必要なのはこのコマンドです:

find ~/TESTDIR -mindepth 1 -maxdepth 1 -type d -not \( -name "keepMe" \) -exec rm -rf {} \;

デモ:

# List what's inside directory we want to remove
$ ls
file1  file2  keepMe/  removeA/  removeB/
# Testing what find gives without removing
$ find ~/TESTDIR -mindepth 1 -type d -not \( -name "keepMe" \)               
/home/xieerqi/TESTDIR/removeA
/home/xieerqi/TESTDIR/removeB
# Actual removal and testls
$ find ~/TESTDIR -mindepth 1 -maxdepth 1 -type d -not \( -name "keepMe" \) -exec rm -rf {} \;
$ ls
file1  file2  keepMe/

説明:

  • find DIRECTORYディレクトリを操作するには、findコマンドを呼び出します
  • -mindepth 1:ディレクトリのコンテンツでのみ動作し、レベル0であるディレクトリ自体を避けます
  • -maxdepth 1:サブディレクトリへの下降を防ぎます(rm -rfはとにかく再帰的であるため、それらを削除するためにサブディレクトリに下降する必要はありません)
  • -type d:ディレクトリのみを検索
  • -not \( -name "keepMe" \)保持したい名前のアイテムを無視
  • -exec rm -rf {} \;見つかった各アイテムの削除を実行します
6

Bashシェルの拡張グロブ機能(現在のUbuntuインストールでデフォルトで有効になっている)を使用して、

$ tree A
A
├── B
├── C
│   ├── ac1
│   └── ac2
└── D

5 directories, 0 files

グロブ式A/!(C)を使用して、Cとそのコンテンツを除くすべてに対処できます。

$ echo A/!(C)
A/B A/D

removeディレクトリCとその内容を除くすべてに、単純に使用できます

rm -rf A/!(C)

去る

$ tree A
A
└── C
    ├── ac1
    └── ac2

3 directories, 0 files
8
steeldriver

簡単な方法の1つは、trash-cliを使用することです

Sudo apt-get install trash-cliでインストールできます

インストールしたら、cd /Aを使用して親ディレクトリAに移動し、trash B Dコマンドを発行できます。ここで、BとDは削除するディレクトリです(それらはドライブのゴミ箱に移動します)オンになっているので、間違えた場合はファイルを回復できます)

Ubuntu 16.04および14.04でテスト済み

5
Elder Geek

Bashのforループとtestを使用して、目的のディレクトリをフィルター処理し、rm -rfコマンドを使用して、次のように再帰的にディレクトリを削除します。

for x in /path/to/parent/*; do test "$x" != "dir_survive" && rm -rf "$x"; done

これは、/path/to/parent/内のすべての要素(ファイルおよびディレクトリ)を反復処理し、その名前がdir_surviveと等しくない場合、要素を再帰的に削除します。親ディレクトリが現在のディレクトリである場合、*をパスとしてのみ書き込むことができます。

不明で、アクションを実行せずに最初に削除される要素をテストする場合は、上記のコマンドのrm -rfechoに置き換えるだけで、削除候補のみが出力されます。

実行例を次に示します。

$ tree
.
├── dir1
│   ├── subdir1
│   │   ├── file1
│   │   └── file2
│   └── subdir2
│       ├── file1
│       └── file2
├── dir2
│   ├── subdir1
│   │   ├── file1
│   │   └── file2
│   └── subdir2
│       ├── file1
│       └── file2
└── dir_survive
    ├── subdir1
    │   ├── file1
    │   └── file2
    └── subdir2
        ├── file1
        └── file2

9 directories, 12 files

$ for x in *; do test "$x" != "dir_survive" && rm -rf "$x"; done

$ tree
.
└── dir_survive
    ├── subdir1
    │   ├── file1
    │   └── file2
    └── subdir2
        ├── file1
        └── file2

3 directories, 4 files
4
Byte Commander