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

标签 linux bash shell ubuntu unix

第一次在这里发帖,抱歉。 我想编写一个脚本,将文件列表从一个目录复制到另一个目录。在复制过程中,脚本应将文件名的第一个字母大写,并将所有其他字母小写。另外,将文件的所有者更改为给定所有者,并更改权限以授予一组权限。

我是 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/

相关文章:

linux - 为什么使用换行符作为 IFS 时会有额外的输出?

python - 为什么来自 python 结果的 shell 脚本中的变量工作奇怪?

linux - Windows xp 上的 shell 脚本

c - 在引号内使用变量?

php - yum 更新依赖错误

java - Linux ./configure 不会检测到 java 或 javac

macos - 如何将执行命令的时间添加到 Mac 上的终端? (改变格式)

regex - Linux : Replace key-value pair, 值包含文件路径

linux - 如何在 shell 脚本中使用 grep 在文件中查找单词

python - pydev eclipse 上的 django 交互式 shell 出错