您尚未登录。

#16 2012-08-22 19:01:10

nopriler
会员
注册时间: 2012-01-03
帖子: 393

Re: [已解决] BASH脚本:将A/B/*移动到A/

phoenixlzx 说:

遍历循环就是把某一个目录下的所有目录都过一遍(遍历)的一个循环。。。

既然是多个那么想简单就得用循环了。。。否则就几步的操作也不难啊。

求指教,求实例。
我写了这样的脚本:(在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)

离线

#17 2012-08-22 19:07:26

nopriler
会员
注册时间: 2012-01-03
帖子: 393

Re: [已解决] BASH脚本:将A/B/*移动到A/

百合仙子 说:

第三级只有文件没有目录?那这样

mv */*/* .
rmdir --ignore-fail-on-non-empty -p */*

第三级实际上是有目录的。我想把第三级里的东西原封不动地搬到第二级。但mv */*/*似乎会把第三级的东西给移到第一级。

离线

#18 2012-08-22 20:04:02

依云
会员
所在地: a.k.a. 百合仙子
注册时间: 2011-08-21
帖子: 8,384
个人网站

Re: [已解决] BASH脚本:将A/B/*移动到A/

nopriler 说:

第三级实际上是有目录的。我想把第三级里的东西原封不动地搬到第二级。但mv */*/*似乎会把第三级的东西给移到第一级。

你早点说是移到第二级嘛:

for d in */*/*; do
  n=$d:h
  mv $d $n:h
  rmdir $n
done

zsh only!

离线

#19 2012-08-22 20:20:09

nopriler
会员
注册时间: 2012-01-03
帖子: 393

Re: [已解决] BASH脚本:将A/B/*移动到A/

百合仙子 说:
nopriler 说:

第三级实际上是有目录的。我想把第三级里的东西原封不动地搬到第二级。但mv */*/*似乎会把第三级的东西给移到第一级。

你早点说是移到第二级嘛:

for d in */*/*; do
  n=$d:h
  mv $d $n:h
  rmdir $n
done

zsh only!

貌似我从头到尾都是这个意思...
:h 在 zsh里是干什么的。我用的是BASH..

离线

#20 2012-08-22 21:53:41

sigma
会员
注册时间: 2012-01-03
帖子: 183

Re: [已解决] BASH脚本:将A/B/*移动到A/

nopriler 说:
sigma 说:
nopriler 说:

A/B/只是模板...实际上那些文件夹的命名是没有规则的。

那方法不是一样吗?只不过两个循环咯

恕我愚笨。没有规则要怎么写循环?

我以为我们在讨论用bash实现?for...in...


riverrun, past Eve and Adam's.

离线

#21 2012-08-22 22:05:45

依云
会员
所在地: a.k.a. 百合仙子
注册时间: 2011-08-21
帖子: 8,384
个人网站

Re: [已解决] BASH脚本:将A/B/*移动到A/

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) 这样子应该就是了。

离线

#22 2012-08-22 23:12:35

nopriler
会员
注册时间: 2012-01-03
帖子: 393

Re: [已解决] BASH脚本:将A/B/*移动到A/

sigma 说:
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)

离线

#23 2012-08-23 13:16:44

sigma
会员
注册时间: 2012-01-03
帖子: 183

Re: [已解决] BASH脚本:将A/B/*移动到A/

nopriler 说:
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.

离线

#24 2012-08-23 15:21:18

nopriler
会员
注册时间: 2012-01-03
帖子: 393

Re: [已解决] BASH脚本:将A/B/*移动到A/

百合仙子 说:
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)

离线

#25 2012-08-23 19:51:03

依云
会员
所在地: a.k.a. 百合仙子
注册时间: 2011-08-21
帖子: 8,384
个人网站

Re: [已解决] BASH脚本:将A/B/*移动到A/

nopriler 说:

你好,我改写的Bash脚本如下:

for d in ./*/*/*
do
    n=$(dirname $d)
    m=$(dirname $n)
    mv "$d" "$m"
    rmdir --ignore-fail-on-non-empty "$n"
done

但我还是发现,这个对部分文件夹无效。

部分文件夹是哪些?

离线

#26 2012-08-23 20:57:54

nopriler
会员
注册时间: 2012-01-03
帖子: 393

Re: [已解决] BASH脚本:将A/B/*移动到A/

百合仙子 说:
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)

离线

页脚