linux - 移动并删除文件夹中所有匹配 grep 的文件

标签 linux bash awk grep

这个命令:

find buffer/ | grep -i $varname

返回文件名列表。我想将它们每个压缩到单独的 zip 文件中,然后

  • 将这些压缩文件保存到文件夹output/(但每个文件都与原始文件同名,除了扩展名应该是.zip)
  • 删除原始文件(响应 find buffer/| grep -i $varname 的文件)

编辑(@Cyrus):

我已经为此敲了 20 分钟,这是我能想到的最好的:

find buffer/ | grep -i $varname -exec zip "output/"'{}'.zip '{}' \;

最佳答案

看起来像是 xargs 的工作:

find buffer/ | grep -i "$varname" | xargs -n1 -I{} -- zip "output/{}.zip" {}

对于 varname="" 和文件夹 buffer 是这样创建的:

mkdir buffer
touch buffer/1 buffer/2

命令将执行:

zip output/buffer/1.zip buffer/1
zip output/buffer/1.zip buffer/2

您可能想从文件名中删除 buffer 部分,我们可以为此使用 sed 's#^buffer/##'。我们可以指示 find 只列出带有 -type f 的文件。所以如下:

find buffer/ -type f | grep -i "$varname" | sed 's#buffer/##' | xargs -n1 -I{} -- zip "output/{}.zip" buffer/{}

将执行:

zip output/1.zip buffer/1
zip output/2.zip buffer/2

要删除原来的文件,我们可以这样做:

find buffer/ -type f | grep -i "$varname" | sed 's#buffer/##' | xargs -n1 -I{} -- bash -c 'zip "output/{}.zip" buffer/{}; rm "buffer/{}"'

如果你想遍历文件并做一些更高级的事情,你可以使用 while read line :

find buffer/ -type f | grep -i "$varname" | sed 's#buffer/##' \
| while read -r line; do 
    zip output/${line}.zip buffer/${line}
    rm buffer/${line}
done

关于linux - 移动并删除文件夹中所有匹配 grep 的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51004905/

相关文章:

bash - 在 Bash 脚本中指定 sftp 的密码

bash - bash 中 "$*"有哪些用例?

linux - 如何使用 shell 语言格式化文件中的行?

linux - 如何打印特定行的最后一列?

shell - 在 shell 脚本中禁止输出到屏幕

linux - 如何测量应用程序或进程的实际内存使用情况?

linux - Makefile:当一个文件在另一个文件之后更新时执行特定命令

c - 使用 "mmap"从文件读取时得到空输出

Linux gvim 与 vim

apache - 如何在 awk 中打印一系列数据?