Arrays 在脚本中使用数组

Arrays 在脚本中使用数组,arrays,bash,nested-loops,Arrays,Bash,Nested Loops,这是我想做的。我有一个Samba共享目录和几个子目录。结构如下: /srv/samba/Docutrack/3200/controls ./3200/census ./3200/stat ./3400/controls ./3400/census...etc 你明白了。对于嵌套循环,我要做的是遍历所有子Docutrack级别的子目录,并

这是我想做的。我有一个Samba共享目录和几个子目录。结构如下:

/srv/samba/Docutrack/3200/controls
                    ./3200/census
                    ./3200/stat
                    ./3400/controls
                    ./3400/census...etc
你明白了。对于嵌套循环,我要做的是遍历所有子Docutrack级别的子目录,并使用我已经放在一起的命令重新命名ls中的所有文档。重命名后,ls中的所有文档将在一天结束时复制到临时目录进行压缩和存档。然后,原始文档将转移到其特定名称的CIFS共享

我现在在每个目录的基础上工作,但由于我们有20个不同的设施(3200、3400、3700…等等),每个设施有9个子目录,如果我可以在我们进入新位置时添加设施id和子目录,这将更加容易。我参加了Linux+的Linux课程,但直到本月才有脚本编写经验。我真的很喜欢它,但是没有太多关于嵌套循环和bash语法工作原理的知识,我希望这里的每个人都能运行它

下面是一个我现在正在使用的示例。这并不漂亮,但希望你能指引我哪里出了问题

#!/bin/bash

cd /srv/samba/Docutrack/;

declare -a FacArr=("3200","3300","3400",3700")
declare -a FldArr=("controls","census","stat","issues")
Prefix= "Fac_`$FacArr[i]`_`$FldArr[j]`_"`date +_%b_%d_%Y,%H.%M.%S`"
target=/srv/samba/temp;

for i in ${FacArr[@]}
   for j in ${FldArr[@]}
do mv $file ${Prefix}_${file}
重命名后的结束文件将如下所示:

"Fac_3700_controls__Aug_27_2013,12.05.01_SFTP_test_2.txt"
 "Fac_3400_stat__Aug_27_2013,12.05.01_SFTP_test_2.txt"
非常感谢你能给予的任何帮助

编辑 所以我可以澄清一点,这是一张纸条,它成功地实现了我对每个目录的要求:

#!/bin/bash

# cd into working path, all file paths will be relative to this path
cd /srv/samba/Docutrack/3700/controls;

# Set your variables
target=/srv/samba/temp;

# Rename all docs in current directory
for file in `ls`
do 
  mv $file "Fac_3700_controls_"`date +_%b_%d_%Y,%H.%M.%S`${file}
done

# Copy recursively the folders you need to the $target/ directory
cp -a /srv/samba/Docutrack/3700/controls/. $target/;


# Move renamed documents to distination directory
mv /srv/samba/Docutrack/3700/controls/* /media/controls/
EDIT2

这是我目前的剧本。它运行时没有错误,但实际上什么都不做。不重命名任何文件,不复制任何文件,也不移动任何文件。我不知道为什么它完成时没有错误,但没有成功。明天我将继续做这件事。再次感谢大家的帮助

/bin/bash

cd /srv/samba/Docutrack/

FacArr=('3200' '3300' '3400' '3700')
FldArr=('controls' 'census' 'stat' 'issues')
prefixDate=$(date +_%b_%d_%Y,%H.%M.%S_)
target=/srv/samba/temp

for i in ${FacArr[@]}; do
    for j in ${FldArr[@]}; do
        for file in "/${FacArr[i]}/${FldArr[j]}/"*; do
            mv "$file" "/Fac_${FacArr[i]}_${FldArr[j]}_${prefixDate}_${file}"
               cp -a /srv/samba/Docutrack/${FacArr[i]}/${FldArr[j]}/. $target/
            mv /srv/samba/Docutrack/${FacArr[i]}/${FldArr[j]}/* /${FacArr[i]}/ ${FldArr[j]}/
        done
    done
done
最终编辑

我终于把剧本写好了。谢谢大家的帮助。我把范围缩小到我认为可能存在的问题,并解决了所有变量解析问题。以下是最后的脚本:

#!/bin/bash
#cd /srv/samba/Docutrack/
#
FacArr=('3200' '3300' '3400' '3700')
FldArr=('billing_pa' 'census' 'controls' 'delivery' 'discharge_dc' 'issues' 'med_recs' 'new_admit' 'new_orders' 'refills' 'stat')
prefixDate=$(date +_%b_%d_%Y.%H.%M.%S)
target=/srv/samba/temp/
#
for i in ${FacArr[@]}; do
     for j in ${FldArr[@]}; do
        cd "/srv/samba/Docutrack/""$i"/"$j"/
        for file in ` ls `; do
            mv $file "Fac_""$i""_""$j""_${prefixDate}_""$file"
            cp -a ` ls `  $target
            mv ` ls ` "/media/""$j"/
         done
    done
done

这对你有用吗

cd /srv/samba/Docutrack/

FacArr=('3200' '3300' '3400' '3700')
FldArr=('controls' 'census' 'stat' 'issues')
prefixDate=$(date +_%b_%d_%Y,%H.%M.%S)
target=/srv/samba/temp

for i in "${FacArr[@]}"; do
    for j in "${FldArr[@]}"; do
        for file in "${FacArr[i]}/${FldArr[j]}/"*; do
            mv "$file" "$target/Fac_${FacArr[i]}_${FldArr[j]}_${prefixDate}_${file}"
        done
    done
done

您想将这些文件放在
$target
目录中,我说得对吗?

评论1:行尾不需要分号。评论2:您的任务很复杂,但您的问题可能不是。你能不能简化你的问题描述,只保留与实际问题相关的内容(我确实意识到这并不像听起来那么容易),或者更具体地说明你的脚本打算做什么,它实际上做了什么,以及为什么这不是你想要的?我相信它没有做什么,错误太多。注释3:这可能与您的任务无关,但请注意,bash允许您同时“全局”多个目录级别。例如,试试这个:
ls/srv/samba/Docutrack/*/*/*
非常感谢您的快速响应。我不知道glob函数,但这听起来正是我想要的。我现在会经常使用它。到TL;DR my question,我需要一个嵌套循环来遍历一系列父目录,并使用我的时间-日期戳重命名一系列子目录中的所有文档,然后将其复制到目标位置,然后在复制后移动到CIFS共享。所有这些都是在一个标准脚本中完成的,但所述脚本必须为每个父目录和子目录创建。这将花费太长时间。这看起来会很好地工作。实际上,我并不想在mv命令中移动文档,只是想将它们重命名到同一个目录。接下来,我将递归地将所有重命名的文档复制到$target dir,以便以后存档,并将最后一个mv复制到CIFS共享。我运行脚本,它不会出错,但也不会重命名或移动任何文档。不过,据我所知,脚本看起来是正确的。