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

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

在将内容放入其中之前,我正在清理输出目录。我想用一个.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

要删除除.gitkeepin之外的所有内容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 *第一个会删除它们,但第二个不会(使用默认的 shell 选项)。但是,当然,需要递归才能删除子目录。

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

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

答案3

尝试这个:

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

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

答案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

但您可以安全地忽略它们。

相关内容