bash 在 while 循环中使用通配符查找存档文件列表

bash 在 while 循环中使用通配符查找存档文件列表

我有几千个 gzip 压缩的文本文件,它们位于不同的子目录中,几年前我用这些文件的子集作为项目的输入。当时我在一个目录中有一个实际使用的文件的解压副本,但我删除了它,只保留了该文件夹中这些解压​​文件的列表。

这是我最初的想法,LIST是文件列表。PARENTDIR是所有文件驻留在各个子目录中的顶层目录。这个想法是找到所有档案,无论它们位于哪个子目录中,然后将它们压缩到NEWDIR

#!/usr/bin/env bash    

LIST="listfile.txt"
PARENTDIR="/home/user/old/project"
NEWDIR="/home/user/old/project/2016"

while read line;
do
    ARCHIVE="$(find $PARENTDIR -name "$line*")"
    gunzip --stdout $ARCHIVE >$NEWDIR/$line
done <$LIST

我似乎没有正确使用 find 命令。它没有变量也能工作,但即使没有命令替换,在命令行上调用,它也无法工作。我的引号和通配符组合不太正确,但我无法正确使用,变量扩展也无济于事,我想我被困住了……

答案1

我考虑使用-exec选项,find但由于命令中使用的重定向运算符,这不起作用gunzip。一种解决方案是分两步执行操作:

1. 将档案复制到$NEWDIR

    while read line
    do
        find "$PARENTDIR" -name "$line*" -exec cp -v {} "$NEWDIR" \;
    done < "$LIST"

这应该适用于POSIX 兼容版本find– 不仅仅是 GNU 可以找到。

避免覆盖类似名称的文件

如果有重复的文件名,它们将在 中被覆盖$NEWDIR。如果您想避免覆盖文件,则必须在 中重新创建目录树$NEWDIR。这可以使用install以下命令完成GNU 核心实用程序从而创造了全部路径的各部分类似于mkdir -p

    cd "$NEWDIR"
    while read line
    do
        find . -name "$line*" -exec install -D {} $NEWDIR/{} \;
    done < "$LIST"
    cd -

2.解压复制的文件:

    find "$NEWDIR" -exec gunzip {} \;

相关内容