我非常新手Bash脚本编写,为了练习,我尝试编写一个脚本,该脚本需要输入源目录和目标目录。该脚本将搜索源目录并复制其子目录结构到目标目录中(任何文件都将被忽略,只有目录本身会被复制)。源目录可以有任意数量的子目录,深度也可以不同。最好的方法是什么?我已经开始尝试编写递归函数,如果找到目录,则递归地调用该函数。然而,由于我对脚本编写的经验缺乏,我一直被卡住了。
以下是我到目前为止所做的:
我知道这只是一个基本的函数,还需要投入更多的工作,但我只是希望在继续之前得到指导,确定这是否是正确的方法,如果是,下一步应该怎么做?如何将目录传递给我的函数? 编辑:在Ivan的帮助下,这是我的解决方案 #! /bin/bash
该解决方案存在两个问题:
以下是我到目前为止所做的:
#! /bin/bash
if [ ! $# -eq 2 ]; then
echo "ERROR: Script needs 2 arguments: $0 source/directory/ target/directory/"
exit
fi
SOURCE_DIR=$1
TARGET_DIR=$2
function searchForDirectory {
for FILE in ls $SOURCE_DIR/*; do #should be 'ls *current_directory*'
if [ -d $FILE ]; then
searchForDirectory #call function recursively onto $FILE
#Do stuff here to create copy of this directory in target dir
fi
done
}
if [ ! -d $SOURCE_DIR ]; then
echo "ERROR: Source directory does not exist"
exit
else
searchForDirectory
fi
我知道这只是一个基本的函数,还需要投入更多的工作,但我只是希望在继续之前得到指导,确定这是否是正确的方法,如果是,下一步应该怎么做?如何将目录传递给我的函数? 编辑:在Ivan的帮助下,这是我的解决方案 #! /bin/bash
if [ ! $# -eq 2 ]; then
echo -e "\nERROR: Script needs 2 arguments:\n$0 source/directory/ target/directory/\n"
exit
fi
function recursiveDuplication {
for file in `ls $1`; do
if [ -d $1/$file ] && [ ! -d $2/$file ]; then
mkdir $2/$file
recursiveDuplication $1/$file $2/$file
elif [[ $1/$file == *.png ]]; then
convert $1/$file $2/$file
fi
done
}
if [ ! -d $1 ]; then
echo -e "\nERROR: $1 does not exist\n"
exit
elif [ -d $2 ] && [ ! -w $2 ]; then
echo -e "\nERROR: You do not have permission to write to $2\n"
exit
elif [ ! -d $2 ]; then
echo -e "\nSUCCESS: $2 has been created"
mkdir $2
fi
recursiveDuplication $1 $2
该解决方案存在两个问题:
正如Rany Albeg Wein在下面解释的那样,使用“ls”不是一个好的解决方案 - 当目录/ *.png名称中有空格时,我看到了为什么。
我也试图将源中的任何*.png文件复制到目标并在目标中将其转换为*.jpg图像。我该怎么做?我尝试使用ImageMagick的
convert image.png image.jpg
命令,但我不知道当image.png
被称为$file
时该怎么做?
find
和cpio
来完成。执行命令find source -type d | cpio -pd target
,将从source
复制整个目录树到target
。如果以root
用户身份执行该命令,则权限和所有权都将被保留。如果以非root
用户身份执行,则只能保留权限。 - alvits