Bash:将名为n10的任何目录的内容移动到一个级别

时间:2014-03-28 13:41:13

标签: linux bash shell

我有一个目录结构,里面有许多名为“n10”的目录。这些目录出现在我目录结构根目录的许多不同级别。给定的“n10”目录可以包含文件和其他目录,但是没有“n10”目录在树下面的任何地方有另一个名为“n10”的目录(或该文件的文件)。

我使用的是RedHat Bash shell,我目前的工作目录是上述目录结构的根目录。坐在这个目录中,我需要发出一个命令:

对于每个“n10”目录,我需要将该目录中的所有内容向上移动一级,以便它现在与所述“n10”目录并行。这将使“n10”目录为空。

请注意,当“n10”目录的子目录如上所述向上移动一级时,它必须保留与移动前完全相同的树结构。具体来说,我试图说它移动时不应该“扁平化”。

我最好的尝试是:

find . -path \*n10 -execdir bash -c 'mv -t .. {}/*' \;

这导致此输出:

mv: cannot move `./n10/config1' to `../config1': Directory not empty
mv: cannot move `./n10/config2' to `../config2': Directory not empty
mv: cannot move `./n10/config1' to `../config1': Directory not empty

我发现有些文件被复制到我的目录结构的根目录。我还发现当目录发生这种情况时,会产生上述错误。

有人知道如何解决这个问题吗?

2 个答案:

答案 0 :(得分:2)

有关从find安全调用shell片段的讨论,请参阅http://mywiki.wooledge.org/UsingFind#Complex_actions

find . -type d -name n10 \
  -exec bash -c '
     for arg; do
       cp "$arg"/* "${arg%/*}"
     done
  ' _ {} +

请注意,POSIX指定的-exec ... {} + ,但只是该标准的最新版本;对于find的较早实现,您可能需要使用{} ';'

答案 1 :(得分:1)

无论如何,添加另一个答案(所有@Charles的评论)

$ cat n10rename 
mkdir -p ./{d1/{d11,n10/{sn1,sn2,sn3},d13},d2,d3/{d31,d32,d33/n10/{d3x1,d3x2,d3x3}}}
tree

while IFS= read -r -d '' n10
do
    (cd "$n10" && exec mv * ..)
done < <(find . -name \*n10 -print0)

tree

这更精简并产生:

$ bash n10rename
.
├── d1
│   ├── d11
│   ├── d13
│   └── n10
│       ├── sn1
│       ├── sn2
│       └── sn3
├── d2
├── d3
│   ├── d31
│   ├── d32
│   └── d33
│       └── n10
│           ├── d3x1
│           ├── d3x2
│           └── d3x3
└── n10rename

16 directories, 1 file
.
├── d1
│   ├── d11
│   ├── d13
│   ├── n10
│   ├── sn1
│   ├── sn2
│   └── sn3
├── d2
├── d3
│   ├── d31
│   ├── d32
│   └── d33
│       ├── d3x1
│       ├── d3x2
│       ├── d3x3
│       └── n10
└── n10rename

16 directories, 1 file