Answers:
使用GNU find(在Linux上可以找到)或任何其他支持-execdir
以下功能的发现相当简单:
find A -type f -execdir mv -i {} .. \;
符合标准find
:
find A -type f -exec sh -c 'mv -i "$1" "${1%/*}/.."' sh {} \;
使用zsh:
zmv -Q -o-i 'A/(**/)*/(*)(.)' 'A/$1$2'
如果目录结构始终具有相同的嵌套级别,则不需要任何递归遍历(但首先删除空目录):
for x in */*; do; echo mv -i "$x"/*/* "$x"/..; done
我的第一个猜测是
$ find A -type f -exec mv {} .. \;
只要您不指定-depth
它就可以。我还没有尝试过,因此请先进行测试,然后再提交。
如果您只想移动叶目录中的文件(即如果包含子目录/A/B/file
,/A
则不想移动到该B
目录),则可以通过以下两种方法:
两者都需要这个
leaf ()
{
find $1 -depth -type d | sed 'h; :b; $b; N; /^\(.*\)\/.*\n\1$/ { g; bb }; $ {x; b}; P; D'
}
shopt -s nullglob
这个作品:
leaf A | while read -r dir
do
for file in "$dir"/*
do
parent=${dir%/*}
if [[ -e "$parent/${file##*/}" ]]
then
echo "not moved: $file"
else
mv "$file" "$parent"
fi
done
done
这样会更快,但是它不喜欢空的源目录:
leaf A | while read -r dir
do
mv -n "${dir}"/* "${dir%/*}"
remains=$(echo "$dir"/*)
[[ -n "$remains" ]] && echo "not moved: $remains"
done