ディレクトリBとDを削除したい。しかし、Cとそのすべての子孫ファイルとディレクトリを保持したい。 1つのディレクトリとその子を除く、親ディレクトリのすべての子ディレクトリを削除するコマンドは何ですか。
感謝します。
必要なのはこのコマンドです:
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 {} \;
見つかった各アイテムの削除を実行します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
簡単な方法の1つは、trash-cliを使用することです
Sudo apt-get install trash-cli
でインストールできます
インストールしたら、cd /A
を使用して親ディレクトリAに移動し、trash B D
コマンドを発行できます。ここで、BとDは削除するディレクトリです(それらはドライブのゴミ箱に移動します)オンになっているので、間違えた場合はファイルを回復できます)
Ubuntu 16.04および14.04でテスト済み
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 -rf
をecho
に置き換えるだけで、削除候補のみが出力されます。
実行例を次に示します。
$ 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