在我把东西放进去之前,我正在清理一个输出目录。我想用一个.gitkeep
文件跟踪 git 中的输出目录,但这一直被我rm -rf "$OUT_DIR"
在 bash 脚本中的行删除。
有没有办法删除目录的内容但保留隐藏文件或以某种方式保留该.gitkeep
文件?
问题在于,对于隐藏文件,递归删除的rm -r *
行为与非递归删除的行为不同。rm *
第一个会删除它们,但第二个不会(使用默认的 shell 选项)。但是,当然,需要递归才能删除子目录。
我的解决方案是使用 move 来保留隐藏文件,而不是删除。虽然还有几行,但当你这样做时就有意义了(没有需要记住的奇怪选项)。
mkdir ../deleteme
mv * ../deleteme
rm -rf ../deleteme
Run Code Online (Sandbox Code Playgroud)
默认情况下bash
不使用 glob 点文件,因此要删除 . 中除隐藏文件之外的所有内容bash
,请使用rm
:
rm *
Run Code Online (Sandbox Code Playgroud)
示例输出:
rm *
Run Code Online (Sandbox Code Playgroud)
要删除除.gitkeep
in 之外的所有内容bash
,请为点文件启用通配符并使用rm
:
shopt -s dotglob
rm !(.gitkeep)
Run Code Online (Sandbox Code Playgroud)
示例输出:
~/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
Run Code Online (Sandbox Code Playgroud)
尝试这个:
shopt -u dotglob # disable globbing for dot files
ls *
Run Code Online (Sandbox Code Playgroud)
如果一切正常,则替换ls
为rm
.