第一次在这里发帖,抱歉。 我想编写一个脚本,将文件列表从一个目录复制到另一个目录。在复制过程中,脚本应将文件名的第一个字母大写,并将所有其他字母小写。另外,将文件的所有者更改为给定所有者,并更改权限以授予一组权限。
我是 shell 脚本新手,所以我只了解 CP、MV、RENAME 等命令,我不想使用任何更高级的命令,即使它可以让我的生活更轻松。
这里的代码仅显示目录中的所有文件我无法找到解决问题的方法
cd [directory]
for i in *
do
echo "$i"
done > filename.txt
我想要的是它询问我有关源目录、目标目录和所有者/权限的信息,脚本将完成其余的工作。
最佳答案
有趣的挑战,我会咬住,但我必须使用比你说的更多的工具,因为否则无法做到。
问题 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 操作系统)。否则,我们通过在其前面添加当前目录来使其成为绝对目录。我还假设您使用的是 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
存在,并且它不包含任何您不介意覆盖的内容!
关于linux - 用于复制、重命名和更改文件所有者权限的 Shell 脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57413276/