用于复制,重命名和更改文件所有者权限的Shell脚本

时间:2019-08-08 13:01:18

标签: linux bash shell ubuntu unix

第一次在这里发布问题,请提前对不起。 我想编写一个脚本,将文件列表从一个目录复制到另一个目录。在复制期间,脚本应将文件名的首字母大写,其他所有字母均小写。另外,将文件的所有者更改为给定的所有者,然后更改权限以提供一组权限。

我是Shell脚本的新手,所以我只了解诸如CP,MV,RENAME之类的命令,即使可以使我的生活更轻松,我也不想使用任何更高级的命令。

这里的代码仅显示目录中的所有文件,我找不到解决问题的方法

cd [directory]
for i in *
do
    echo "$i"
done > filename.txt

我要问的是有关源目录,目标目录和所有者/权限的信息,脚本将完成其余的工作。

3 个答案:

答案 0 :(得分:0)

您可以使用此:

SrcDir=/kjdfskdf/ksdfjsdjkf
DestDir=/dest

for Name in *
do 
OrgName="$Name" # save org file name
Name=$(echo $Name| tr [:upper:] [:lower:])  # change all to lower
Name=$(echo ${Name:0:1} | tr  '[a-z]' '[A-Z]')${Name:1} # change first char 
echo cp -R $SrcDir/$OrgName $DestDir/$Name  # display cp cmd recursive - if all 
# correct 
# delete echo
done

答案 1 :(得分:0)

此脚本可用于获得结果。

#!/bin/bash
source="."
destination="testdir"
permission="+x"
ownername="someone"
while IFS= read -r line; do
  foo=$line
  foo="$(tr '[:upper:]' '[:lower:]' <<< ${foo})"
  foo="$(tr '[:lower:]' '[:upper:]' <<< ${foo:0:1})${foo:1}"
  cp $source/$line $destination/$foo
  chmod $permission $destination/$foo
  chown $ownername $destination/$foo
done < file.txt

在此脚本中,file.txt包含要复制的文件名和变量-源目录的source,目标目录的destination,权限的permission进行设置,ownername设置所有者名称。

要从命令行获取参数而不是硬编码值,必须使用source=$0destination=$1等。

答案 2 :(得分:0)

有趣的挑战,我会咬,但我将不得不使用比你说的更多的工具,因为否则无法完成。

问题1-更改文件名的大小写:

Bash具有变量扩展名,可让您更改变量中的大小写。

f="my FILENAME in Mixed cap"
g=${f,,}  # $g is now $f all in lower case; ${f,} would only lower the first letter
h=${g^}   # $h is now $g with the first letter capitalized; ${g^^} would upper c the whole string

问题2-更改所有权

这只能使用chown完成,无法解决。

chown new_owner file

在大多数情况下,您无权执行此操作,因此您将需要sudo来执行此操作,或者以root的身份运行整个脚本。但是,如果您希望新所有者成为您自己,则默认情况下会在运行cp时发生,因此您无需做任何特殊的事情即可实现。

问题3-更改权限

在这里,您需要chmod,同样,它也无法解决。

chmod new_permission file

问题4-CD源使目标路径无效

如果目标目录不是绝对路径,则cd $source将使其无效。我们可以使用pwd来解决此问题。

dest=some/dir
if [[ $dest !~ ^/ ]]; then
   dest=`pwd`/$dest
fi

这部分脚本使用bash的内置正则表达式匹配检查目标目录的第一个字符是否是斜杠,在这种情况下,它是绝对路径(我在这里假设* nix OS)。否则,我们在当前目录前添加绝对值。我还假设您正在使用bash 4。

放在一起

#!/bin/bash
source=$1
dest=$2
owner=$3
perm=$4

if [[ ! $dest =~ ^/ ]]; then
   dest=`pwd`/$dest
fi

cd $source
for f in *; do
   g=${f,,}
   h=${g^}
   cp "$f" "$dest/$h"
   chown "$owner" "$dest/$h"
   chmod "$perm" "$dest/$h"
done

调用此脚本

您可以使用read从终端读取参数,但是我更喜欢使用命令行参数。

根据需要调用脚本,说script.sh,使其可执行,然后以这种方式调用它:

script.sh source_path dest_path new_owner new_perms

注意事项

  • 您没有说过要递归复制,因此我没有处理$source中的目录。这也可以处理,但要复杂得多。

  • 我没有执行任何错误检查。我已经测试了脚本,并且脚本可以正常工作,但是请确保$dest在您开始之前就已经存在,并且其中不包含您不介意覆盖的内容!