在将内容放入其中之前,我正在清理输出目录。我想用一个.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
in之外的所有内容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 *
如果一切正常,则替换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
但您可以安全地忽略它们。