【问题标题】:Shell script to copy,rename and change owner permissions of file [closed]用于复制、重命名和更改文件所有者权限的 Shell 脚本 [关闭]
【发布时间】:2019-08-08 13:01:18
【问题描述】:

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

我是 shell 脚本的新手,所以我只了解 CP、MV、RENAME 等命令,我不想使用任何更高级的命令,即使它可以让我的生活更轻松。

这里的代码只显示目录中的所有文件,我想不出办法解决我的问题

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

我想要的是询问我有关源目录、目标目录和所有者/权限的信息,其余的由脚本完成。

【问题讨论】:

  • and I don't want to use any more advanced commands even if it could make my life easier. 真的吗?因此,您基本上是在告诉您希望我们在没有工具的情况下为您做事。太糟糕了,因为 install read 和 Bash 字符串操作或 sed 本来可以做你想做的事。但是既然你明确不想使用比mvcpcd更复杂的东西。我们也无法为您提供帮助。
  • 这看起来像 IMO 作业。您应该针对您的问题了解“如何在 shell 脚本中传递变量”
  • CP、MV、RENAME = 不幸的是,这些命令无法实现您的目标。

标签: linux bash shell ubuntu unix


【解决方案1】:

有趣的挑战,我会咬一口,但我必须使用比你说的更多的工具,否则无法做到。

问题 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 source 使 dest 路径无效

如果目标目录不是绝对路径,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 存在,并且它不包含任何你不介意被覆盖的内容!

【讨论】:

  • OMg,它就像一个魅力,我从来没有这样想过这个问题,你的解释比我的老师好多了哈哈。只是对作为命令行传递的权限有一个小小的疑问,我应该更喜欢我的意思是 chmod 与 r w x 或像 0,1,2,4 这样的数字一起使用
  • 很高兴为您提供帮助。对于权限,您可以使用chmod 接受的任何格式:+rx,或777,或其他任何直接在chmod 中有效的格式。
【解决方案2】:

你可以用这个:

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

【讨论】:

  • 谢谢,真的帮了我大忙。
  • PS:当我检查我的目标文件夹时,我只能看到 .和..并且没有其他文件被复制我可以找出原因。 SrcDir=/home/rushi/Folder1 DestDir=/home/rushi/Folder2 for Name in SrcDir 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
  • 你必须删除回显:cp -R $SrcDir/$OrgName $DestDir/$Name
  • LOL 谢谢你真是太愚蠢了。
  • 没问题。如果您要更改所有者或权限,您可以在循环中添加: chmod 666 $DestDir/$Name # 这个只是示例和 chown newuser:newgroup $DestDir/$Name
【解决方案3】:

这个脚本可以用来实现结果。

#!/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 等。

【讨论】:

  • 您好,感谢您的帮助,我只是有一些小疑问。我替换了源文件夹和目标文件夹,它在最后一行给我一个错误,该文件不存在,如果我删除文件名,它会显示文件意外结束错误。请注意,我必须像 .sh 文件一样运行它。再一次感谢你的帮助。 PS:source="home/rushi/Folder1" destination="home/rushi/Folder2"
  • 嗨。你有没有给出绝对路径?例如: source="/home/rushi/Folder1" 这样?是的,您可以将其作为 bash filename.sh 或 ./filename.sh 运行
  • 是的,我已经给出了绝对路径。
  • 脚本所在位置有file.txt吗?因为上面的脚本只复制了file.txt文件中列出的文件。我从您的问题中了解到,您只需要将一些文件从一个目录复制到另一个目录。所以我从file.txt中获取要复制的文件列表。因此,请在最后一行提供文件的正确路径。我认为,它应该可以解决问题。
  • 您好,感谢您的回复,您对我很有帮助目录我很抱歉我对这个格式化系统很糟糕。
猜你喜欢
  • 1970-01-01
  • 2016-09-27
  • 1970-01-01
  • 1970-01-01
  • 2011-04-20
  • 2014-08-11
  • 1970-01-01
  • 2013-11-16
  • 1970-01-01
相关资源
最近更新 更多