遍历循环就是把某一个目录下的所有目录都过一遍(遍历)的一个循环。。。
既然是多个那么想简单就得用循环了。。。否则就几步的操作也不难啊。
求指教,求实例。
我写了这样的脚本:(在C/下运行)
for i in ./*
do
mv ./"$i"/*/* ./"$i"
done
但这个脚本似乎会还会把第四级目录下的东西(C/A/B/D/,C/作第一季目录)移到第二级(C/A/B/)。本来这没什么,但第四级目录下有文件和第三级目下的文件同名。结果冲突了,而第四级目录下的东西也消失了(mv的特性?)。求一个能把第三级目录下的东西完全复制到第二级目录的方法。
更新/补充
==========
使用上面的脚本会出现问题。修改如下:
for i in *
do
mv ./"$i"/*/* ./"$i"
done
但是否还会移动第四级目录仍未知。
最近编辑记录 nopriler (2012-08-23 22:22:19)
离线
第三级只有文件没有目录?那这样
mv */*/* . rmdir --ignore-fail-on-non-empty -p */*
第三级实际上是有目录的。我想把第三级里的东西原封不动地搬到第二级。但mv */*/*似乎会把第三级的东西给移到第一级。
离线
第三级实际上是有目录的。我想把第三级里的东西原封不动地搬到第二级。但mv */*/*似乎会把第三级的东西给移到第一级。
你早点说是移到第二级嘛:
for d in */*/*; do
n=$d:h
mv $d $n:h
rmdir $n
done
zsh only!
离线
nopriler 说:第三级实际上是有目录的。我想把第三级里的东西原封不动地搬到第二级。但mv */*/*似乎会把第三级的东西给移到第一级。
你早点说是移到第二级嘛:
for d in */*/*; do n=$d:h mv $d $n:h rmdir $n done
zsh only!
貌似我从头到尾都是这个意思...
:h 在 zsh里是干什么的。我用的是BASH..
离线
sigma 说:nopriler 说:A/B/只是模板...实际上那些文件夹的命名是没有规则的。
那方法不是一样吗?只不过两个循环咯
恕我愚笨。没有规则要怎么写循环?
我以为我们在讨论用bash实现?for...in...
riverrun, past Eve and Adam's.
离线
百合仙子 说:nopriler 说:第三级实际上是有目录的。我想把第三级里的东西原封不动地搬到第二级。但mv */*/*似乎会把第三级的东西给移到第一级。
你早点说是移到第二级嘛:
for d in */*/*; do n=$d:h mv $d $n:h rmdir $n done
zsh only!
貌似我从头到尾都是这个意思...
:h 在 zsh里是干什么的。我用的是BASH..
但是我才明白……
:h 就是取 dirname 的意思,bash 里换成 $(dirname $d) 这样子应该就是了。
离线
nopriler 说:sigma 说:nopriler 说:A/B/只是模板...实际上那些文件夹的命名是没有规则的。
那方法不是一样吗?只不过两个循环咯
恕我愚笨。没有规则要怎么写循环?
我以为我们在讨论用bash实现?for...in...
确实是bash。我要问的是,for的条件要怎么写?搞不清楚你的思路。
麻烦看下这个:
for i in ./*
do
mv ./"$i"/*/* ./"$i"
done
行么?
最近编辑记录 nopriler (2012-08-23 15:22:00)
离线
sigma 说:nopriler 说:sigma 说:nopriler 说:A/B/只是模板...实际上那些文件夹的命名是没有规则的。
那方法不是一样吗?只不过两个循环咯
恕我愚笨。没有规则要怎么写循环?
我以为我们在讨论用bash实现?for...in...
确实是bash。我要问的是,for的条件要怎么写?搞不清楚你的思路。
麻烦看下这个:
for i in ./* do mv ./"$i"/*/* ./"$i" done
行么?
可以啊,in的列表可以用正则或者直接展开怎么都行
riverrun, past Eve and Adam's.
离线
nopriler 说:百合仙子 说:nopriler 说:第三级实际上是有目录的。我想把第三级里的东西原封不动地搬到第二级。但mv */*/*似乎会把第三级的东西给移到第一级。
你早点说是移到第二级嘛:
for d in */*/*; do n=$d:h mv $d $n:h rmdir $n done
zsh only!
貌似我从头到尾都是这个意思...
:h 在 zsh里是干什么的。我用的是BASH..但是我才明白……
:h 就是取 dirname 的意思,bash 里换成 $(dirname $d) 这样子应该就是了。
你好,我改写的Bash脚本如下:
for d in ./*/*/*
do
n=$(dirname $d)
m=$(dirname $n)
mv "$d" "$m"
rmdir --ignore-fail-on-non-empty "$n"
done
但我还是发现,这个对部分文件夹无效。
最近编辑记录 nopriler (2012-08-23 15:25:00)
离线
你好,我改写的Bash脚本如下:
for d in ./*/*/* do n=$(dirname $d) m=$(dirname $n) mv "$d" "$m" rmdir --ignore-fail-on-non-empty "$n" done
但我还是发现,这个对部分文件夹无效。
部分文件夹是哪些?
离线
nopriler 说:你好,我改写的Bash脚本如下:
for d in ./*/*/* do n=$(dirname $d) m=$(dirname $n) mv "$d" "$m" rmdir --ignore-fail-on-non-empty "$n" done
但我还是发现,这个对部分文件夹无效。
部分文件夹是哪些?
比如说『新建文件夹』等,还有一些纯英文的文件夹。而且本来只有69个文件(68个文件夹+1脚本),执行后多出6个文件(4个文件夹+2图片)(忘了说,这些文件夹是放图片的)。总之一句话:乱七八糟。
更新/补充
==========
虽然以上引起以上问题的原因未知,但大概可以确定是引号引起的。
在 变量 $d 带有 ./,而我又把 $d 用引号引了起来。把 ./ 去掉应该就没问题了。(不过,不想去试了)
for d in */*/*
do
n=$(dirname $d)
m=$(dirname $n)
mv "$d" "$m"
rmdir --ignore-fail-on-non-empty "$n"
done
最近编辑记录 nopriler (2012-08-23 22:30:31)
离线