Linux Bash:将名为n10的任何目录的内容上移一级

Linux Bash:将名为n10的任何目录的内容上移一级,linux,bash,shell,Linux,Bash,Shell,我有一个目录结构,其中有许多名为“n10”的目录。这些目录出现在我的目录结构的根目录深处的许多不同级别。一个给定的“n10”目录可以包含文件和其他目录,但没有一个“n10”目录在它下面的树中有另一个名为“n10”的目录(或文件) 我使用的是RedHat Bash shell,目前的工作目录是上述目录结构的根目录。在这个目录中,我需要发出一个命令,该命令将: 对于每个“n10”目录,我需要将该目录中的所有内容向上移动一级,以便它现在与所述的“n10”目录平行。这将使“n10”目录为空 请注意,当“

我有一个目录结构,其中有许多名为“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
我发现一些文件被复制到我的目录结构的根目录。我还发现,当目录发生这种情况时,就会出现上述错误

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

有关从
find
安全调用shell片段的讨论,请参阅

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

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

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


这不是昨天在#bash on Freenode中提出并回答的吗?需要在
pushd
参数中引用。在子shell中使用
(cd“$n1”和&exec mv*)
可能比使用pushd/popd麻烦得多。否则,这是一个很大的进步+1….顺便说一句,有一个参数是
-d$'\0'
有误导性的——它意味着shell可以在参数内表示NUL值,而该参数与
-d'
@CharlesDuffy-是的,子shell
(cd…)完全相同(并且行为相同)
比:)好。哦——一个错误:你需要清除
IFS
以防止文件名上的尾随空格被read剥离:
而IFS=read-r-d''n10
@CharlesDuffy hm-老实说,尾随空格问题对我来说是新的。。。谢谢你给我指。。。
$ 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