如何压缩目录中大于某个特定大小的文件?

4

这段代码的思路是找到目录中所有大于1KB(或1000字节)的文件,将它们压缩,并从原始目录中删除。我已经能够找出两个单独的命令,但不确定如何将第一个命令的输出链接到第二个命令(如果有意义的话)?有谁能指点我一下吗?

# Initialize variables
dir=~/Test 

# Change directory to $DIRECTORY
cd "$dir"

# Find all files in the current directory that are larger than 1000 bytes (1KB).
find . -maxdepth 1 -type f -size +1000c | zip -mT backup

还可以在Super User上查看如何查找大于/小于x字节的文件? - jww
3个回答

4

使用-exec选项,而不是尝试将下一个命令通过管道传递:

find . -maxdepth 1 -type f -size +1000c -exec zip -mT backup {} \;

会创建一个包含匹配文件的zip归档文件。

通过查看find命令的man页,我应该意识到那是一个选项。谢谢!现在我遇到了一个错误,find: paths must precede expression- 我的路径应该只是一个.(当前目录),这肯定在表达式之前,所以有关于为什么会出现这个错误的任何想法吗? - IAspireToBeGladOS
听起来好像发生了一些Shell扩展,通常如果某些东西(如路径、变量等)没有正确引用,就会发生这种错误;还有其他原因存在,但需要更具体的细节... - l'L'l

2

之前我提供了一个桩代码,但我决定完善这个脚本。尽管如此,它仍无法处理包含通配符的文件名等极端情况。

#!/usr/bin/bash
# the following line handles filenames with spaces
IFS='
'
backupfilename=backup;

for file in $(find . -maxdepth 1 -type f -size +1000c)
do
  if zip ${backupfilename} -u "${file}" # test that zip succeeded
  then
     echo "added file ${file} to zip archive ${backupfilename}" 1>&2;
     # add your remove command here; remember to use quotes "${filename}"
     echo "file ${file} has been deleted" 1>&2;
  fi
done

我唯一没有提到的是删除命令。你应该自己解决这个问题,并仔细测试,以确保不会意外删除你不想删除的文件。


通过这种方式,您还可以在删除应该添加到归档文件中的文件之前测试归档命令是否成功。 - Thomas Hedden
如果目录中有任何带有空格或通配符的文件,这将失败 - 因为单词拆分和全局匹配。 - codeforester
为了处理带有空格的文件名,在for循环之前添加以下行: IFS=' ' 这表示仅使用换行符来分隔文件名。我还需要研究带通配符的文件名。 - Thomas Hedden
set -f 可以抑制通配符扩展。 - codeforester
我的上一个评论格式不正确:新行被删除了。它应该是IFS='<new line>'。在某些shell中,您还可以使用IFS='\n'。 - Thomas Hedden
我完全重写了我的原始帖子。它考虑了coreforester提到的文件名中包含空格的问题。 - Thomas Hedden

0
使用xargs将find命令的每一行输出作为zip参数传递:
find . -maxdepth 1 -type f -size +1000c | xargs -I f zip -mT backup f

你也可以使用 while 循环来实现相同的功能:

find . -maxdepth 1 -type f -size +1000c | while read f ; do zip -mT backup $f ; done

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接