第一次在这里发布问题,请提前对不起。 我想编写一个脚本,将文件列表从一个目录复制到另一个目录。在复制期间,脚本应将文件名的首字母大写,其他所有字母均小写。另外,将文件的所有者更改为给定的所有者,然后更改权限以提供一组权限。
我是Shell脚本的新手,所以我只了解诸如CP,MV,RENAME之类的命令,即使可以使我的生活更轻松,我也不想使用任何更高级的命令。
这里的代码仅显示目录中的所有文件,我找不到解决问题的方法
cd [directory]
for i in *
do
echo "$i"
done > filename.txt
我要问的是有关源目录,目标目录和所有者/权限的信息,脚本将完成其余的工作。
答案 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=$0
,destination=$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
在您开始之前就已经存在,并且其中不包含您不介意覆盖的内容!