如何删除目录中除隐藏文件外的所有文件?

tar*_*yte 8 bash rm

在我把东西放进去之前,我正在清理一个输出目录。我想用一个.gitkeep文件跟踪 git 中的输出目录,但这一直被我rm -rf "$OUT_DIR"在 bash 脚本中的行删除。

有没有办法删除目录的内容但保留隐藏文件或以某种方式保留该.gitkeep文件?

mee*_*ern 9

问题在于,对于隐藏文件,递归删除的rm -r *行为与非递归删除的行为不同。rm *第一个会删除它们,但第二个不会(使用默认的 shell 选项)。但是,当然,需要递归才能删除子目录。

我的解决方案是使用 move 来保留隐藏文件,而不是删除。虽然还有几行,但当你这样做时就有意义了(没有需要记住的奇怪选项)。

mkdir ../deleteme
mv * ../deleteme
rm -rf ../deleteme
Run Code Online (Sandbox Code Playgroud)


kos*_*kos 8

默认情况下bash不使用 glob 点文件,因此要删除 . 中除隐藏文件之外的所有内容bash,请使用rm

rm *
Run Code Online (Sandbox Code Playgroud)

示例输出:

rm *
Run Code Online (Sandbox Code Playgroud)

要删除除.gitkeepin 之外的所有内容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)


Cyr*_*rus 4

尝试这个:

shopt -u dotglob        # disable globbing for dot files
ls *
Run Code Online (Sandbox Code Playgroud)

如果一切正常,则替换lsrm.

  • 您可能希望“ls -d *”避免列出任何匹配目录的内容。 (3认同)