我需要编写一个 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
为了保留模式、所有权、时间戳)。