隠しファイルを除くディレクトリ内のすべてのファイルを削除するには?

隠しファイルを除くディレクトリ内のすべてのファイルを削除するには?

コンテンツを入れる前に出力ディレクトリを整理しています。.gitkeepファイルを使用してgitの出力ディレクトリを追跡したいのですが、rm -rf "$OUT_DIR"bashスクリプト内の行はファイルを削除し続けます。

ディレクトリの内容を削除し、隠しファイルを保存したり、そのファイルを保存したりする方法はありますか.gitkeep

答え1

bashデフォルトでは、ファイルは完全にドットとして表示されないため、隠しファイルを除くすべての項目を削除するには、次bashのようにしますrm

rm *

出力例:

~/tmp$ ls -la
total 8
drwxrwxr-x  2 user user 4096 giu 11 20:00 .
drwxr-xr-x 21 user user 4096 giu 11 08:26 ..
-rw-rw-r--  1 user user    0 giu 11 20:00 .1
-rw-rw-r--  1 user user    0 giu 11 20:00 2
-rw-rw-r--  1 user user    0 giu 11 20:00 3
-rw-rw-r--  1 user user    0 giu 11 20:00 4
-rw-rw-r--  1 user user    0 giu 11 20:00 5
~/test$ rm *
~/tmp$ ls -la
total 8
drwxrwxr-x  2 user user 4096 giu 11 20:00 .
drwxr-xr-x 21 user user 4096 giu 11 08:26 ..
-rw-rw-r--  1 user user    0 giu 11 20:00 .1

.gitkeepを除くすべての項目を削除するには、bashドットファイルのグロービングを有効にし、次を使用しますrm

shopt -s dotglob
rm !(.gitkeep)

出力例:

~/tmp$ ls -la
total 8
drwxrwxr-x  2 user user 4096 giu 11 20:19 .
drwxr-xr-x 21 user user 4096 giu 11 08:26 ..
-rw-rw-r--  1 user user    0 giu 11 20:19 1
-rw-rw-r--  1 user user    0 giu 11 20:19 2
-rw-rw-r--  1 user user    0 giu 11 20:19 3
-rw-rw-r--  1 user user    0 giu 11 20:19 4
-rw-rw-r--  1 user user    0 giu 11 20:19 5
-rw-rw-r--  1 user user    0 giu 11 20:19 .gitkeep
-rw-rw-r--  1 user user    0 giu 11 20:19 .hidden
~/tmp$ shopt -s dotglob
~/tmp$ rm !(.gitkeep)
rm: cannot remove ‘.’: Is a directory
rm: cannot remove ‘..’: Is a directory
user@user-X550CL:~/tmp$ ls -la
total 8
drwxrwxr-x  2 user user 4096 giu 11 20:20 .
drwxr-xr-x 21 user user 4096 giu 11 08:26 ..
-rw-rw-r--  1 user user    0 giu 11 20:19 .gitkeep

答え2

問題は、隠しファイルの場合、再帰削除が非rm -r *再帰削除とは異なる動作をすることです。rm *1つ目は削除しますが、2つ目は削除しません(デフォルトのシェルオプションを使用)。ただし、もちろん、サブディレクトリを削除するには再帰が必要です。

私の解決策は、移動を使用して隠しファイルを削除する代わりにアーカイブすることでした。まだ数行が残っていますが、やってみると意味があります(覚えておくべき奇妙なオプションはありません)。

mkdir ../deleteme
mv * ../deleteme
rm -rf ../deleteme

答え3

この試み:

shopt -u dotglob        # disable globbing for dot files
ls *

すべてが正常な場合は、ls交換してくださいrm

答え4

rm *ディレクトリにサブディレクトリがない場合、この方法はうまく機能します(参照:@kosの答え)。ただし、すべてのサブディレクトリも削除する再帰的なソリューションが必要な場合(例:@ meesern指摘したrm -r *はあなたが望むものではないのでする隠しファイルとサブディレクトリを削除します。

find代わりに、を使用して非表示のファイルとサブディレクトリを一覧表示および削除できます(以下で修正)。この回答):

find YOUR_DIRECTORY -not -path '*/\.*' -delete

非表示のYOUR_DIRECTORYファイルを削除すると、すべての空のサブディレクトリと非表示のファイル以外のすべてのファイルが削除されます。

そうだろういいえ隠しディレクトリ(たとえばYOUR_DIRECTORY/.foo/bar/baz)のコンテンツを削除します。したがって、次の警告を受け取ることができます。

find: cannot delete 'some/directory/here': Directory not empty

でも無視しても安全です。

関連情報