我想在 Linux 终端内创建一个 bash 脚本来进入一个文件,然后在该文件为空时将其删除:
#!/bin/bash
echo " Enter name of a directory"
read Dir
for Directory in $( ls $HOME )
do
test -d $HOME/$dir
if [ $# -eq 0 ]
then
for filename in $( ls $HOME/$Dir )
do
test -d $HOME/$dir/$filename
if [ ! -s "$filename" ]
then
rm $HOME/$dir/$filename
else
echo " not empty"
fi
done
else
echo " $Dir is not a directory"
fi
done
这是我正在使用的代码,但它不起作用。它可以识别创建的文件,但即使为空也不会删除它。 Salah 显示没有这样的文件或目录
答案1
编辑 1 (Erik Renouf) 坚持查找 The Open Group 基本规范第 6 期中指定的内容
编辑 2(通配符)+ 符号和原始 {}
试试这个,更换我的目录在下面的命令行中输入需要计算的目录名称:
find "${HOME}"/mydir -size 0 -type f -exec rm {} +
它正在删除位于“${HOME}”/mydir 目录及其子目录(如果有)中的所有空文件。
下面有一个脚本版本:
#!/bin/bash --
find "${HOME}"/"${1}" -size 0 -type f -exec rm {} +
测试
列出下面的所有空文件测试:
$ find "${HOME}"/testd -size 0 -type f
/home/jay/testd/empty_file.txt
使用脚本删除空文件:
$ chmod +x clearner.sh
$ ./clearner.sh testd
检查空文件:
$ find "${HOME}"/testd -size 0 -type f
$
答案2
我确实喜欢使用find
它,因为它可以很好地处理带有特殊字符的文件名。您可以使用 GNU 来完成,find
类似于 @Jay 建议的或更便携的方式
find "$HOME/$dir" -type f -size 0c -exec rm {} +
它将查找$HOME/mydir
所有子目录。所有文件 ( -type f
) 且大小为 0 字节 (-size 0c) 的文件都会将其名称作为参数应用到rm
,并且我们将让命令行具有许多参数,而不是rm
为每个文件调用(+
而不是调用的\;
到-exec
)
如果您不想进入子目录并希望它是可移植的,您可以执行以下操作,我将其放入子 shell 中,以免从当前 shell 中的当前目录进行更改:
( cd "$HOME/$dir"; find . ! -name . -prune -type f -size 0c -exec rm {} + )
这将用于-prune
防止find
进入进一步的目录,并将丢弃该.
目录,这将阻止它成为下降的目录列表的一部分。这两个结果find
仅报告当前目录的结果。
现在我们位于当前目录中,我们可以重新访问您正在编写的脚本,因为我们再次接近该方法。
您应该小心在脚本中尝试的方法。任何带有字符IFS
(如空格或制表符)的文件都会导致您的 for 循环查看部分文件名(例如,如果调用一个文件,with space
您将在不同的迭代中得到with
和)。space
如果要循环目录中的文件,最好使用像
for f in $HOME/$dir/*; do
if [ -f "$f" ] && [ ! -s "$f" ]; then
printf "It's an empty file: %s" "$f"
fi
done
.
除非您启用 dotglob,否则此 glob 解决方案不会拾取任何以 while 开头的文件。