大家好,
我正在尝试对包含具有特定扩展名的文件的子文件夹运行命令。我想在文件夹本身内部运行命令,并在文件夹本身内部生成任何输出。
这是我想要实现的目标的说明。我要从这个开始:
.
└── 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