第二个mkdir
不想要$PWD
:
now=$(date +"%m_%d_%Y")
DIR="/nmr/charlie"
mkdir $DIR/cx1_$now
for name in $(find $DIR -maxdepth 1 -type d)
do
if [[ "$name" != "$DIR" ]]
then
(cd $DIR/cx1_$now; mkdir $name)
(cd $DIR/$name
cp file1.ext $DIR/cx1_$now/$name
cp file2.ext $DIR/cx1_$now/$name
)
fi
done
另外,PWD 是一个内置变量;你不应该设置它(通过cd
命令除外)。
您不需要if
;中的对称测试 您可以使用!=
而不是=
避免空then
子句(好的,它包含一个很好的止痛:
命令;如果您反转测试,则不需要它)。
我通常将cd
操作放入子外壳中;这样,我就不会那么困惑了。第二行的替代方法mkdir
是这样,它不需要cd
or 子shell:
mkdir -p $DIR/cx1_$now/$name
我建议对日期使用 ISO 8601 格式,例如:
now=$(date +"%Y_%m_%d")
这样,目录将自动按日期顺序排序。
我仍然收到错误:
mkdir: cannot create directory `/nmr/charlie/directory_name_1': File exists
/home/charlie/Desktop/scripts/test.sh: line 16: cd: /nmr/charlie//nmr/charlie/directory_name_1: No such file or directory
问题可能意味着我们还没有正确过滤。例如,每次创建备份目录时,都会将之前的备份目录全部备份到新的目录中,这就有点过分了。所以,练习的另一部分是过滤find
更好的输出。
...我们应该使用目录的基本名称,我们也可以避免所有cd
操作:
now=$(date +"%m_%d_%Y")
DIR="/nmr/charlie"
mkdir $DIR/cx1_$now
for name in $(find $DIR -maxdepth 1 -type d | grep -v '/cx1_[^/]*$')
do
if [[ "$name" != "$DIR" ]]
then
targetdir=$DIR/cx1_$now/$(basename $name)
mkdir -p $targetdir
cp $name/file1.ext $name/file2.ext $targetdir
fi
done
您确实知道使用“sh -x script.sh”或“bash -x script.sh”来运行脚本并查看它在做什么。我什至不确定我们是否需要从列表中过滤掉任何看起来像备份目录的if
条件。grep
我注意到这仅在目录路径健全且不包含空格的情况下才有效。如果您使用不可移植的文件名(仅使用可移植的名称),事情就会很快出错[-_.A-Za-z0-9]
。换行符和空格真的很乱。
请注意,如果您在目录下或除其本身/nmr/backup/charlie
以外的任何地方进行备份,这会更简单。/nmr/charlie
然而,小心,它可以根据要求在原地完成。