我有一个目录结构,里面有许多名为“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
我发现有些文件被复制到我的目录结构的根目录。我还发现当目录发生这种情况时,会产生上述错误。
有人知道如何解决这个问题吗?
答案 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