在包含特定扩展名的文件的子文件夹中运行命令

在包含特定扩展名的文件的子文件夹中运行命令

大家好,

我正在尝试对包含具有特定扩展名的文件的子文件夹运行命令。我想在文件夹本身内部运行命令,并在文件夹本身内部生成任何输出。

这是我想要实现的目标的说明。我要从这个开始:

.
└── folder
    ├── subfolder 1
    │    ├── file.abc
    │    └── file2.abc
    ├── subfolder 2
    │    └── file.xyz
    ├── subfolder 3
    │    └── file.def
    └── subfolder 4

在这种情况下,我想找到子文件夹 1 和 3,并在其中运行命令,并且所述命令的输出也位于各自的文件夹内,如下所示

.
└── folder
    ├── subfolder 1
    │    ├── file.abc
    │    ├── file.out
    │    ├── file2.abc
    │    ├── file2.out
    │    └── subfolder.out
    ├── subfolder 2
    │    └── file.xyz
    ├── subfolder 3
    │    ├── file.def
    │    ├── file.out
    │    └── subfolder.out
    └── subfolder 4

这段代码有效,在里面运行folder

if ()(($#)) */*.(abc|def|ghi)(NY1-.); then

        for file (*/*.(abc|def|ghi)) command1 $file && command2 ${file} > $file.out && command3 * > subfolder.out
    else echo "No appropriate files found"
fi

但是,当在文件夹command3**.(abc|def|ghi)文件夹内尝试为每个subfolder.out子文件夹生成一个文件时,我希望它在所述文件夹内生成一个包含结果的文件。我得到的是,无论我在哪里运行脚本,该文件都会生成并被覆盖,而不是像我想要的那样在文件夹内。因此,如果我在 top 内运行此脚本folder,我会得到以下结果:

.
└── folder
    ├── subfolder.out
    ├── subfolder 1
    │    ├── file.abc
    │    ├── file.out
    │    ├── file2.abc
    │    └── file2.out
    ├── subfolder 2
    │    └── file.xyz
    ├── subfolder 3
    │    ├── file.def
    │    └── file.out
    └── subfolder 4

我希望它生成如下

.
└── folder
    ├── subfolder 1
    │    ├── file.abc
    │    ├── file.out
    │    ├── file2.abc
    │    ├── file2.out
    │    └── subfolder.out
    ├── subfolder 2
    │    └── file.xyz
    ├── subfolder 3
    │    ├── file.def
    │    ├── file.out
    │    └── subfolder.out
    └── subfolder 4

回顾一下:我想测试子文件夹是否存在具有特定扩展名的文件,然后我想在包含这些文件的文件夹内运行命令,并使生成的输出全部位于创建它们的文件夹内。我想对它在文件夹中找到的特定扩展名的每个文件运行命令,但也要对通配符运行命令*.(abc|def|ghi)。我想运行 command3全部它找到的任何扩展名的文件,而不是它找到的任何扩展名的每个单独文件。

我基本上是想 cd 进入包含具有正确扩展名的文件的文件夹,然后 command3 * > subfolder.out 。文件 subfolder.out 必须创建并保留在正确的子文件夹中。

我怎样才能做到这一点?提前致谢。

答案1

尝试find使用-execdir这样的选项的命令

find <directory> -type f -name "*.<extension>" -execdir <command> {} \;

find命令将搜索目录对于所有带扩展名的文件 (*)扩大它会运行命令在文件 ( {}) 所在的目录中。

另一个例子:

find /home/mike/ -type f -name "*.java" -execdir pwd \;

上面的命令将查找目录中的所有 java 文件/home/mike/,并将打印出pwd找到的任何文件的当前工作目录 ( )。如果您需要对当前文件运行命令,请使用{}第一个示例中所示的命令。

所以基本上这应该适合您的用例:

$ tree
.
├── subfolder1
│   ├── test2.abc
│   ├── test2.efgs
│   └── test.abc
├── subfolder2
│   └── test.def
└── subfolder3
    └── test.xyz

然后运行查找:

find /home/mike/ -type f \( -name "*.abc" -o -name "*.def" -o -name "*.ghi" \) -execdir sh -c "command3 '{}' > subfolder.out" \;

这导致:

tree
.
├── subfolder1
│   ├── subfolder.out
│   ├── test2.abc
│   ├── test2.efgs
│   └── test.abc
├── subfolder2
│   ├── subfolder.out
│   └── test.def
└── subfolder3
    └── test.xyz

相关内容