我将以递归方式运行数据的基本目录,然后修改其中的每个文件,并在另一个基本目录上创建一个新文件。所以我需要两个参数,一个是原始数据库目录的路径,另一个是我放入新文件的基本目录。但是我的代码有问题。当我把这两个参数放在main函数下时,而不是在终端上输入它们。希望有人可以帮助我。
以下是我的代码:
function traverse() {
for file in $(ls "${data_path}")
do
echo "in file: ${data_path}/${file}"
if [[ ! -d ${data_path}/${file} ]]; then
if [[ ${data_path}/${file} == *.nii.gz ]];then
echo "is nifti: ${data_path}/${file} "
else
echo "not file"
echo ${data_path}
temp_path=${data_path/'/data2/Projects/Incoming_monkey'/}
new_path="${new_destination}/${temp_path}"
mkdir -p ${new_path}
echo ${new_path}
fi
else
echo "entering recursion with: ${data_path}/${file}"
traverse "${data_path}/${file}" "${new_destination}"
fi
done
}
function main() {
echo "main start"
data_path=/data2/Projects/Incoming_monkey/MAJOM/08_20170706/func
new_destination=/data2/Projects/reorientation
traverse "${data_path}" "${new_destination}"
}
main
答案 0 :(得分:0)
我没有试图推断代码背后的逻辑,但我可以看到一些明显的错误。在main函数中创建的变量data_path
和new_destination
是全局的,这就是为什么您能够在traverse
函数中读取它们的原因。为了解决这个问题,我在它们之前添加了declare
关键字,以便成为main函数的本地关键字。此外,您将这两个变量作为参数传递给traverse
函数,该函数从代码中不读取任何参数。为了解决这个问题,我将变量名称替换为$ 1和$ 2,将它们作为参数读取。
编辑:找到更多需要本地化的变量。 (temp_path
和new_path
)
#!/bin/bash
function traverse() {
for file in $(ls "${1}") # Replace data_path with 1
do
echo "in file: ${1}/${file}"
if [[ ! -d ${1}/${file} ]]; then
if [[ ${1}/${file} == *.nii.gz ]];then
echo "is nifti: ${1}/${file} "
else
echo "not file"
echo ${1}
declare temp_path=${1/'/data2/Projects/Incoming_monkey'/}
declare new_path="${2}/${temp_path}" # Replaced new_destination by 2
mkdir -p ${new_path}
echo ${new_path}
fi
else
echo "entering recursion with: ${1}/${file}"
traverse "${1}/${file}" "${2}"
fi
done
}
function main() {
echo "main start"
declare data_path=/data2/Projects/Incoming_monkey/MAJOM/08_20170706/func
declare new_destination=/data2/Projects/reorientation
traverse "${data_path}" "${new_destination}"
}
main