输入每个文件夹并执行命令(bash或awk等)

输入每个文件夹并执行命令(bash或awk等),bash,Bash,我一直在寻找最有效的方法来实现这一点,但不知何故,没有一个答案能让我满意(因为我可能没有那么好的方法来实现它们) 这就是我的问题,我需要一个bash脚本,它进入每个文件夹(实际路径)并执行命令。 文件夹的名称共享一些字符,但您不能用简单的规则声明任何内容,因此为了解决这个问题,让我们假设它们都有随机名称 我试着做一些事情,比如: cd main_folder cd subfolder_1_a do something cd .. cd subfolder_2_b do somet

我一直在寻找最有效的方法来实现这一点,但不知何故,没有一个答案能让我满意(因为我可能没有那么好的方法来实现它们)

这就是我的问题,我需要一个bash脚本,它进入每个文件夹(实际路径)并执行命令。 文件夹的名称共享一些字符,但您不能用简单的规则声明任何内容,因此为了解决这个问题,让我们假设它们都有随机名称

我试着做一些事情,比如:

cd main_folder  
cd subfolder_1_a
   do something
cd ..
cd subfolder_2_b
   do something
... 
...
cd subfolder_n_z
   do something
然后,如果可能的话,我还想得到这个示例中文件夹名称的一些字符,我想得到最后一个字母(a,b…z)

在本部分中更清楚地说明:

在子文件夹_a中,我想执行如下命令:

if a< 5
command
cd ..
cd subfolder_b
if b<10
command 
etc
如果a<5
命令
光盘
cd子文件夹

如果b您可以在BASH脚本中尝试一个简单的for循环:

for i in "folder1" "folder2" "folder3"
do
   cd "$i"
   pwd
done

可能存在一些语法问题,但基本上它所做的是,对于main_folder目录中的每个条目,如果该条目是一个目录(意味着一个文件夹),则运行该命令

cd /to/your/main_folder
for i in *; do 
   if [ -d "${i}" ]; then 
      # do your commands for example move the directory to home
      mv "${i}" /home
   fi
done
试试(
sh
,然后也试试
bash

有一个相关的问题:当当前工作目录中没有目录时,循环将在
dir
设置为
*
的情况下运行一次。在bash中,您可以通过在shopt-s nullglob前面加上

编辑:也许这对你有帮助

for dir in */; do
    cd "$dir"  # go to subfolder
    dir=${dir%/}  # remove trailing slash
    dir=${dir#subfolder_}  # remove "subfolder_" prefix (no error checking)

    # now do something inside the subfolder. The suffix following the
    # subfolder_ prefix is now stored in the variable "$dir"

    cd -  # go back to parent folder (more precisely, to last folder in history)
done

你说你说的是bash,但是你的shebang行(
#!/usr/bin/perl-s
)说的有些不同;用$dir做一些事情;完成
够了吗?很抱歉,乔,你完全是对的……忘了这一点……我的错误。如果语句中缺少引号。不,
对于主文件夹中的我来说
并没有达到你的预期。它做了什么?我有在CentOS中使用的脚本。。。它只运行一次循环,将
i
设置为字符串
main\u文件夹
Ah,您是对的。我道歉。我已经更新了我的答案。当作为可执行文件执行时,它应该运行良好。谢谢!我会检查它是否工作正常。但是我需要的最后一部分会发生什么呢。从实际子文件夹的名称中获取一些字符(在我正在生成命令的子文件夹中)。有可能吗?@Nikko:您必须更明确地说明您想要获取的内容以及目录名的模式。到目前为止,我们有:输入子文件夹a执行一些命令#缺少的部分从该文件夹的名称中获取字符“a”。执行一个包含这个字符“a”的命令。接下来,我想对每个我没有得到的子文件夹执行同样的操作。如果目录名为
subfolder_XXX
,则
dir=${dir#subfolder}
将从
dir
变量中删除
subfolder
前缀。
for dir in */; do
    cd "$dir"  # go to subfolder
    dir=${dir%/}  # remove trailing slash
    dir=${dir#subfolder_}  # remove "subfolder_" prefix (no error checking)

    # now do something inside the subfolder. The suffix following the
    # subfolder_ prefix is now stored in the variable "$dir"

    cd -  # go back to parent folder (more precisely, to last folder in history)
done