コンテンツを入れる前に出力ディレクトリを整理しています。.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
でも無視しても安全です。