我尝试使用以下命令从文件所在目录提取多个文件:
for i in $(find . -name '*.tgz'); do # search the tgz files and extract them
tar -xvzf $i
done
我期望该命令会在找到这些文件的目录中提取这些文件,但它们被提取到了目录之外。我如何确保 .tgz 文件被提取到它们所在的目录中?
答案1
你应该避免使用如下结构for i in $(find . -name '*.tgz'); do ...
——例如为什么循环查找的输出是不好的做法?- 相反,尽可能使用-exec
或-execdir
直接在找到的文件上运行命令。
对于您的应用程序,-execdir
将完全按照您的意愿执行,tar
即相对于每个.tgz
文件的包含目录执行:
find . -name '*.tgz' -execdir tar -xvf {} \;
也可以看看理解 -exec 选项find
。
答案2
您需要查看tar
手册页: man tar
在发现man tar
-C, --directory=DIR
Change to DIR before performing any operations. This option is
order-sensitive, i.e. it affects all options that follow.
使用命令来获取路径的目录名dirname
。然后,您可以在命令中添加-C $(dirname $i)
提取到 tar 文件所在的目录。因此,您只需将命令更改为:
for i in $(find . -name '*.tgz'); do
tar -xvzf $i -C $(dirname $i)
done