这就是我想要做的。我有一个包含多个子目录的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
答案 0 :(得分: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
目录?