如何使用 find 命令提取文件所在目录?

如何使用 find 命令提取文件所在目录?

我尝试使用以下命令从文件所在目录提取多个文件:

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

相关内容