2012-11-11 106 views
3

我想创建一个文件层次结构来存储数据。我想为每个数据采集会话创建一个文件夹。该文件夹有五个子文件夹,这些文件夹命名如下。我的代码尝试下面给出了一个错误,但我不知道如何纠正它。使许多目录的shell脚本

代码

#!/bin/sh 
TRACES = "/Traces" 
LFPS = '/LFPS' 
ANALYSIS = '/Analysis' 
NOTES = '/Notes' 
SPIKES = '/Spikes' 

folders=($TRACES $LFPS $ANALYSIS $NOTES $SPIKES) 
for folder in "${folders[@]}" 
    do 
    mkdir $folder 
    done 

错误 我声明变量时得到一个错误。如上所述,bash翻转错误Command not found。相反,如果我声明文件名为TRACES = $('\Traces')bash翻转错误No such file or directory

+3

错误是由于空格(请参阅下面的答案)。你不需要循环:只需'mkdir“$ {folders [@]}”'很好。使用更多引号。无论如何,我无法确定所有这些变量。要小心,这些文件夹将在文件系统的根目录中创建,这是一个非常糟糕的主意。 –

+0

@gniourf_gniourf:我打算修改路径。为了这个问题,我只是缩短了它。我正在定义变量,因为我正在进行博士研究,我的主管想要以某种方式命名文件夹。 (叹气) – mac389

+0

要回答你的问题“为什么我会得到一个错误”,这是因为作业中应该读作TRACES =“/ Traces”的空格。除此之外,你的代码应该工作。请在循环中使用'mkdir“$ folder”'(用双引号'''),以防万一你的路径中有空格(如果你声称你没有空格,只要放引号就行了这是编程bash时可以获得的最好的习惯),另外,请用引号括起'folders =(“$ TRACES”“$ LFPS”“$ ANALYSIS”“$ NOTES”“$ SPIKES”)' –

回答

7

取出变量名和值之间的空间:

#!/bin/sh 
TRACES="/Traces" 
LFPS='/LFPS' 
ANALYSIS='/Analysis' 
NOTES='/Notes' 
SPIKES='/Spikes' 

folders=($TRACES $LFPS $ANALYSIS $NOTES $SPIKES) 
for folder in "${folders[@]}" 
do 
    mkdir $folder 
done 

随着空格,bash解释该像

COMMAND param1 param2 

=作为param1

2

我作了如下改动让脚本运行。

作为评论评论,创建挂在根文件系统上的这样的文件夹是不寻常的。

#!/bin/sh 
TRACES="/Traces" 
LFPS='/LFPS' 
ANALYSIS='/Analysis' 
NOTES='/Notes' 
SPIKES='/Spikes' 

folders="$TRACES $LFPS $ANALYSIS $NOTES $SPIKES" 
for folder in $folders 
do 
    mkdir $folder 
done 

位已经从初始变量赋值移除并且我还简化了用于循环,使得它遍历词语的folders字符串。

+3

会更好地循环在数组的元素上,如果你只是离开了数组(现在我们怎么处理文件名中的潜在空间?)。此外,一个循环是没用的,'mkdir $ folders'已经足够了。 –

+0

我同意。我很少考虑Unix/Unix类操作系统环境下的目录文件名中的空格,因为像Rocky Balboa和公寓一样,我从不使用它们;-) http://www.youtube.com/watch?v=eSGweaROZBQ –

+1

+1“不要在根目录下创建类似文件夹” –

3

此外,如果文件夹存在或不存在,您也会事先进行一些检查。 您也可以随时使用-x设置调试shell脚本,您可以使用“mkdir -p”来执行此操作。

5

我正在给定的修复程序的'变量分配'周围没有空格。

使用数组符号看起来像是矫枉过正。允许在名称可能的空间,你可以使用:

for dir in "$TRACE" "$LFPS" "$NOTES" "$PASS" 
do mkdir "$dir" 
done 

但即使是浪费:

mkdir "$TRACE" "$LFPS" "$NOTES" "$PASS" 

如果你担心这个目录可能存在,您可以避免与错误信息:

mkdir -p "$TRACE" "$LFPS" "$NOTES" "$PASS" 

-p选项也是有价值的,如果路径更长,一些中间的目录可能会丢失。如果您确定名称中没有空格,则双引号变为可选(但它们既安全又便宜,因此您最好使用它们)。

+1

这是一个聪明的解决方案,我甚至没有意识到你可以通过m多个参数到'mkdir'。 – isuldor

+0

在最后2个例子中,我发现我必须删除美元($)符号以便bash正确解释命令。 – Paul

+1

@Paul:如果没有看到你输入的内容,就不可能猜出你做错了什么。但是,如果设置了变量(如问题中所述),那么变量名称前面的'$'标志是正确且必要的;如果没有它们,所创建的目录将会有'TRACE','LFPS','NOTES','PASS'而不是'/ Traces','/ LFPS','/ Notes',...'$ PASS'中的任何名称。带有斜杠的名称存在另一组问题;除非以“root”身份登录,否则通常不会在'/'下创建目录。如果你可以创建它们,你就会遇到问题 - 这是可以修复的。 –