如何重命名该文件夹名称的文件名并将所有文件复制到一个文件夹中

时间:2018-06-18 16:51:04

标签: bash shell unix

我是unix的新手。我得到了这样的要求。 我在服务器中有xml文件夹。在该文件夹中,每天,我将在一个文件夹中为每个员工获取不同的员工详细信息。

/server/user/home/xml/e1100123/Employeedetails.xml
/server/user/home/xml/e1100123/Employeesalary.xml
/server/user/home/xml/e1100123/Employeeleaves.xml
/server/user/home/xml/e1100123/Employeestatus.xml
/server/user/home/xml/e1100155/Employeedetails.xml
/server/user/home/xml/e1100155/Employeesalary.xml
/server/user/home/xml/e1100155/Employeeleaves.xml
/server/user/home/xml/e1100155/Employeestatus.xml        

我必须使用filename_employeenumber将所有员工分组到一个文件夹中,如下所示。

/server/user/home/xml/allemployees/Employeedetails-e1100123.xml
/server/user/home/xml/allemployees/Employeesalary-e1100123.xml
/server/user/home/xml/allemployees/Employeeleaves-e1100123.xml
/server/user/home/xml/allemployees/Employeestatus-e1100123.xml
/server/user/home/xml/allemployees/Employeedetails-e1100155.xml
/server/user/home/xml/allemployees/Employeesalary-e1100155.xml
/server/user/home/xml/allemployees/Employeeleaves-e1100155.xml
/server/user/home/xml/allemployees/Employeestatus-e1100155.xml      

如何在unix shell脚本中编写代码?

谢谢...... 西

2 个答案:

答案 0 :(得分:0)

你想要的剧本的裸骨可能是这样的:

<强> script.sh

#!/bin/bash
base_dir=/server/user/home/xml
all_dir=${base_dir}/allemployes
e_dirs=$(ls -d ${base_dir}/e*)
e_files=(Employeedetails.xml Employeesalary.xml Employeestatus.xml Employeeleaves.xml)

if [ ! -d "${base_dir}" ]; then
  echo "ERROR: ${base_dir} doesn't exists!"
fi

if [ ! -d "${all_dir}" ]; then
  echo "INFO: Creating all employees directory at ${all_dir}"
  mkdir "${all_dir}"
fi

for e in ${e_dirs}; do
  pushd "${e}" > /dev/null

  for f in ${e_files[@]}; do
    if [ ! -f ${f} ]; then
      echo "ERROR: Missing ${f} file for employee $(basename ${e})"
    else
      new_file=${all_dir}/${f%.*}-$(basename ${e}).xml
      cp "${e}/${f}" "${new_file}"
    fi
  done

  popd > /dev/null
done

注意:

  • 脚本假定在xml/文件夹中只有employees文件夹,每个文件夹都以较低字符 e 开头,因此我们会e_dirs=$(ls -d ${base_dir}/e*)

  • 脚本仅适用于每个员工文件夹中的文件Employeedetails.xml Employeesalary.xml Employeestatus.xml Employeeleaves.xml文件,忽略其他文件。

  • 如果文件夹不存在,脚本会创建allemployes/文件夹。

  • 脚本制作副本而不是移动(非破坏性),因此您可以使用mv代替cp

我还没有测试过脚本!所以请不要在实时数据上运行:)。随意修改它。

答案 1 :(得分:0)

使用此脚本:

#!/bin/bash 

sourceDir=$1
destDir=$2
dirname=$(basename $1) 

if [ ! -d $2 ] ; then 
                mkdir $2 
fi

for I in $sourceDir/*
do 
                fname=$(basename $I) 
                prefix=$(echo $fname | awk -F "." 'NF{NF-=1};1')
                suffix=$(echo $fname | awk -F "." '{print $NF}')
                target="$destDir/$prefix-$dirname.$suffix"
                cp $I $target
                # I use cp(Copy) command , you can replace this to mv(Move) command . 
                echo $target
done

用法:

./script.sh  [SOURCEDIR] [DESTDIR] 

示例:

./script.sh /server/user/home/xml/e1100123/  /server/user/home/xml/allemployees/