在shell脚本中访问新创建的目录

时间:2016-04-29 03:57:24

标签: bash shell sh

我正在尝试创建一个新文件夹,输入的副本,然后tar该文件夹的内容。我无法弄清楚为什么 - 但它似乎不是搜索我新创建的目录的内容 - 它正在搜索我的整个计算机...返回诸如

之类的行
/Applications/GarageBand.app/Contents/Frameworks/MAAlchemy.framework/Resources/Libraries/WaveOsc/Sine/Sine - Vocal 1.raw is a file
/Applications/GarageBand.app/Contents/Frameworks/MAAlchemy.framework/Resources/Libraries/WaveOsc/Sine/Sine - Vocal 2.raw is a file
/Applications/GarageBand.app/Contents/Frameworks/MAAlchemy.framework/Resources/Libraries/WaveOsc/Sine/Triangle - Arp.raw is a file
/Applications/GarageBand.app/Contents/Frameworks/MAAlchemy.framework/Resources/Libraries/WaveOsc/Sine/Triangle - Asym 4.raw is a file
/Applications/GarageBand.app/Contents/Frameworks/MAAlchemy.framework/Resources/Libraries/WaveOsc/Sine/Triangle - Eml.raw is a file
/Applications/GarageBand.app/Contents/Frameworks/MAAlchemy.framework/Resources/Libraries/WaveOsc/Square is a folder
/Applications/GarageBand.app/Contents/Frameworks/MAAlchemy.framework/Resources/Libraries/WaveOsc/Square/Square - Arp.raw is a file
/Applications/GarageBand.app/Contents/Frameworks/MAAlchemy.framework/Resources/Libraries/WaveOsc/Square/Square - Bl Saw.raw is a file
你能发现一个简单的错误吗?

顺便说一句,我知道tar的脚本还没有出现,但是一旦我可以浏览新文件夹,这将很容易。

#!/bin/bash

##--- deal with help args ------------------
##

print_help_message() {
    printf "Usage: \n"
    printf      "\t./`basename $0` <input_dir> <output_dir>\n"
    printf "where\n"
    printf      "\tinput_dir : (required) the input directory.\n"
    printf      "\toutput_dir : (required) the output directory.\n"
}

if [ "$1" == "help" ]; then
    print_help_message
    exit 1
fi

## ------ get cli args ----------------------
##


if [ $# == 2 ]; then
    INPUT_DIR="$1"
    OUTPUT_DIR="$2"
fi


## ------ tree traversal function -----------
##

mkdir "$2"
cp -r "$1"/* "$2"/

## ------ return output dir name ------------
##

return_output_dir() {
    echo $OUTPUT_DIR/$(basename $(basename $(dirname $1)))
}


bt() {
    output_dir="$1"
    for filename in $output_dir/*; do
        if [ -d "${filename}" ]; then
            echo "$filename is a folder"
            bt $filename
        else
            echo "$filename is a file"
        fi
    done
}

## ------ main ------------------------------
##

main() {
    bt $return_output_dir
    exit 0
}


main
}

1 个答案:

答案 0 :(得分:1)

好吧,我可以告诉你它为什么这样做,但我不清楚它应该做什么,所以我不知道如何解决它。当前的问题是return_output_dir是一个函数,而不是一个变量,因此在命令bt $return_output_dir中,$return_output_dir部分扩展为...... nothing,bt运行时没有争论。这意味着在bt内,output_dir被设置为空字符串,因此for filename in $output_dir/*变为for filename in /*,它会迭代启动卷上的顶级项目。

对于这段代码,还有许多令人困惑/奇怪的事情:

  • 函数main()似乎没有用于任何目的 - 一些主线代码在它之外(特别是解析东西的参数),一些内部,没有明显的原因。在某些语言中需要main函数,但在shell脚本中,将主代码放入内联通常更有意义。 (此外,功能不应exit,它们应return。)

  • 您的变量名为OUTPUT_DIRoutput_dir。使用不同的名称。此外,通常最好坚持使用小写(或混合大小写)变量名称,以避免与shell和其他程序使用的变量发生冲突。

  • 您将$1$2复制到INPUT_DIROUTPUT_DIR,然后继续使用$1$2而不是你刚刚将它们复制到的更明确命名的变量。

  • output_dir在递归函数中已更改,但未声明为local;这意味着bt的内部调用将改变外部可能尝试使用的值,从而导致奇怪。将函数局部变量声明为local以避免麻烦。

  • $(basename $(basename $(dirname $1)))没有意义。假设$1是“/ foo / bar / baz / quux”:然后dirname $1返回/foo/bar/bazbasename /foo/bar/baz返回“baz”,basename baz返回“baz” “再说一次。第二个basename没有做任何事情!无论如何,我很确定整件事情并没有达到预期目的。

  • bt应该递归的目录是什么?您如何称呼它的任何内容均未提及INPUT_DIROUTPUT_DIR

  • 通常,您应该将变量引用放在双引号中(例如for filename in "$output_dir"/*bt "$filename")。你可以在某些地方这样做,但不能在其他地方这样做。