删除 bash 中长度为 0 的文件

删除 bash 中长度为 0 的文件

我想在 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 开头的文件。

相关内容