0

这就是我想做的。我有一个包含多个子目录的 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/

编辑2

这是我拥有的当前脚本。它运行没有错误,但实际上并没有做任何事情。没有文件被重命名,没有文件被复制,也没有文件被移动。我不确定为什么它没有错误地完成但没有成功。明天我会继续努力。再次感谢大家的帮助!

/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
4

1 回答 1

0

那对你有用吗?

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目录中吗?

于 2013-08-28T21:59:16.820 回答