ディレクトリBとDを削除したいのですが、Cとそのすべての子孫のファイルとディレクトリを保持したいのです。1つのディレクトリとその子を除く、親ディレクトリのすべての子ディレクトリを削除するコマンドは何ですか。
感謝します。
A
例では)に直接配置されているファイルはどうですか?それらも削除するか、保持しますか?
ディレクトリBとDを削除したいのですが、Cとそのすべての子孫のファイルとディレクトリを保持したいのです。1つのディレクトリとその子を除く、親ディレクトリのすべての子ディレクトリを削除するコマンドは何ですか。
感謝します。
A
例では)に直接配置されているファイルはどうですか?それらも削除するか、保持しますか?
回答:
あなたが望むのはこのコマンドです:
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
DIRECTORYを操作するためのfindコマンドを呼び出す-mindepth 1
:ディレクトリのコンテンツでのみ機能し、レベル0のディレクトリ自体は避けます-maxdepth 1
:サブディレクトリに降りることを防ぎます(rm -rf
とにかく再帰的であるため、サブディレクトリに降りてそれらを削除する必要はありません)-type d
:ディレクトリのみを検索-not \( -name "keepMe" \)
保持したい名前のアイテムを無視する-exec rm -rf {} \;
見つかったアイテムごとに削除を実行するfind
良い友人はここですが、バッシュのfor
とtest
より良い友達です...>: - D
bashシェルの拡張glob機能(現在のUbuntuインストールではデフォルトで有効になっています)を使用すると、
$ tree A
A
├── B
├── C
│ ├── ac1
│ └── ac2
└── D
5 directories, 0 files
を除くすべてのものC
とその内容をグロブ式を使用してアドレスすることができますA/!(C)
すなわち
$ echo A/!(C)
A/B A/D
したがって、ディレクトリとその内容以外のすべてを削除C
するには、単純に使用できます
rm -rf A/!(C)
去る
$ tree A
A
└── C
├── ac1
└── ac2
3 directories, 0 files
('"
私は経由してリモートで実行したときにssh $VM_ADDRESS "rm -rf $APP_FOLDER/!(node_modules)"
任意のアイデアどうもありがとうございました。?。
extglob
シェルオプションはインタラクティブシェルでのみ有効です-強制的ssh
に実行できるかどうか不明です
1つの簡単な方法は、trash-cliを使用することです。
あなたはそれをインストールすることができます sudo apt-get install trash-cli
インストールしたらcd /A
、次のコマンドtrash B D
で親ディレクトリAに移動し、コマンドを発行し
ます。BとDは削除するディレクトリです(これらは最終的には、それらが存在するドライブのゴミ箱に移動するため、間違いを犯した場合は、ファイルを回復する)
Ubuntu 16.04および14.04でテスト済み
trash ! C
ますか?
trash: cannot trash non existent
! '`
extglob
ただし、 有効にする必要があります。
次のように、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