虽然我使用BASH已有好几年了,但我在BASH脚本编写方面的经验相对有限。
我的代码如下。它应该从当前目录中获取整个目录结构并将其复制到其中 $OUTDIR
。
for DIR in `find . -type d -printf "\"%P\"\040"`
do
echo mkdir -p \"${OUTPATH}${DIR}\" # Using echo for debug; working script will simply execute mkdir
echo Created $DIR
done
问题是,这是我的文件结构的示例:
$ ls
Expect The Impossible-Stellar Kart
Five Iron Frenzy - Cheeses...
Five Score and Seven Years Ago-Relient K
Hello-After Edmund
I Will Go-Starfield
Learning to Breathe-Switchfoot
MMHMM-Relient K
注意空格:-S And for
逐个接受参数,所以我的脚本的输出看起来像这样:
Creating directory structure...
mkdir -p "/myfiles/multimedia/samjmusicmp3test/Learning"
Created Learning
mkdir -p "/myfiles/multimedia/samjmusicmp3test/to"
Created to
mkdir -p "/myfiles/multimedia/samjmusicmp3test/Breathe-Switchfoot"
Created Breathe-Switchfoot
但我需要它从输出中获取整个文件名(一次一行) find
。我也试过制作 find
在每个文件名周围加上双引号。但这没有用。
for DIR in `find . -type d -printf "\"%P\"\040"`
并使用此更改的行输出:
Creating directory structure...
mkdir -p "/myfiles/multimedia/samjmusicmp3test/"""
Created ""
mkdir -p "/myfiles/multimedia/samjmusicmp3test/"Learning"
Created "Learning
mkdir -p "/myfiles/multimedia/samjmusicmp3test/to"
Created to
mkdir -p "/myfiles/multimedia/samjmusicmp3test/Breathe-Switchfoot""
Created Breathe-Switchfoot"
现在,我需要一些可以像这样迭代的方法,因为我也希望运行更复杂的命令 gstreamer
在每个文件上有以下类似的结构。我该怎么做?
编辑: 我需要一个代码结构,它允许我为每个目录/文件/循环运行多行代码。对不起,如果我不清楚。
解: 我最初尝试过:
find . -type d | while read DIR
do
mkdir -p "${OUTPATH}${DIR}"
echo Created $DIR
done
这在大多数情况下都很好。但是,后来我发现由于管道导致while循环在子shell中运行,因此循环中设置的任何变量以后都不可用,这使得实现错误计数器非常困难。我的最终解决方案(来自 关于SO的答案 ):
while read DIR
do
mkdir -p "${OUTPATH}${DIR}"
echo Created $DIR
done < <(find . -type d)
后来这允许我有条件地增加循环中的变量,这些变量将在稍后的脚本中保持可用。
/
和不可打印的字符。但是除了之外什么都是允许 /
和 \0
所以你必须允许他们。