Linux Bash:将名为n10的任何目录的内容上移一级
我有一个目录结构,其中有许多名为“n10”的目录。这些目录出现在我的目录结构的根目录深处的许多不同级别。一个给定的“n10”目录可以包含文件和其他目录,但没有一个“n10”目录在它下面的树中有另一个名为“n10”的目录(或文件) 我使用的是RedHat Bash shell,目前的工作目录是上述目录结构的根目录。在这个目录中,我需要发出一个命令,该命令将: 对于每个“n10”目录,我需要将该目录中的所有内容向上移动一级,以便它现在与所述的“n10”目录平行。这将使“n10”目录为空 请注意,当“n10”目录的子目录如上所述向上移动一级时,它必须保留与移动前完全相同的树结构。具体来说,我想说的是,当它被移动时,它不应该被“压扁” 我对此的最佳尝试是:Linux Bash:将名为n10的任何目录的内容上移一级,linux,bash,shell,Linux,Bash,Shell,我有一个目录结构,其中有许多名为“n10”的目录。这些目录出现在我的目录结构的根目录深处的许多不同级别。一个给定的“n10”目录可以包含文件和其他目录,但没有一个“n10”目录在它下面的树中有另一个名为“n10”的目录(或文件) 我使用的是RedHat Bash shell,目前的工作目录是上述目录结构的根目录。在这个目录中,我需要发出一个命令,该命令将: 对于每个“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