用于将文件复制到以文件所有者命名的子目录的 Bash 脚本

用于将文件复制到以文件所有者命名的子目录的 Bash 脚本

我需要编写一个 bash 脚本,将文件从文件夹复制到以文件命名的子文件夹中。例如,有一个公共目录“For all”,里面有各种文件和目录。文件的名称由所有者的名称加上一些其他符号组成,如 tom1、tom2、tom3、... 或 scott1、scott2、scott3。子文件夹以所有者命名:tom 和 scott。我需要编写一个脚本,将目录“For all”中的所有文件复制到它们各自的子文件夹中。这是我的脚本。

#!/bin/bash
forall=/home/anastasia/Scripts
cd $forall
for file in $forall
 do
        if [ -d $file ]
          then
                continue
          fi
          if [ -e $file ]
          then
                owner='ls -l $file | grep "^-" | awk {'print $£3'}'
                $file=$owner*   
                cp $file $forall/$owner
                chown $owner $forall/$owner/$file
        fi
done

我的脚本有什么问题?它什么都没做。

答案1

除了

for file in $forall

将只执行一次循环,$file设置为目录 /home/anastasia/Scripts,根本问题是

owner='ls -l $file | grep "^-" | awk {'print $£3'}'

将文字字符串分配ls -l $file | grep "^-" | awk {print给变量owner(然后尝试$£3}作为命令执行)。

假设你希望将外引号用作命令替换反引号(并且要£3清楚3):

owner=`ls -l $file | grep "^-" | awk {'print $3'}`

然而现代的方式会$(...)改为使用:

owner=$(ls -l $file | grep "^-" | awk {'print $3'})

然而,这是一种糟糕的查找文件所有者的方法;我建议

owner=$(stat -c %U -- "$file")

除此之外,记得引用你的变量扩展,因此类似于(未经测试):

#!/bin/bash

forall=/home/anastasia/Scripts

for file in "$forall"/*
do
  if [ -d "$file" ]; then
    continue
  fi
  if [ -e "$file" ]; then
    owner=$(stat -c %U -- "$file")
    cp -n "$file" "$forall/$owner"/
    chown "$owner" "$forall/$owner/$file"
  fi
done

请注意,您应该能够chown通过添加适当的选项来消除cp(也许是-p为了保留模式、所有权、时间戳)。

相关内容