我有几千个 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 {} \;