Linux 在Shell中,如何将一个目录的内容移动到同一级别的另一个目录

Linux 在Shell中,如何将一个目录的内容移动到同一级别的另一个目录,linux,shell,Linux,Shell,是否有一种方法可以使用shell脚本将所有内容(除dirM外)移动到dirM?如何: /tmp/test$ ls dir1 dir2 dirM /tmp/test$ mv * dirM/ mv: cannot move `dirM' to a subdirectory of itself, `dirM/dirM' 或者如果您没有使用bash mv $(ls -d * | grep -v ^dirM$) dirM 那么: /tmp/test$ ls dir1 dir2 dirM /tm

是否有一种方法可以使用shell脚本将所有内容(除dirM外)移动到dirM?

如何:

/tmp/test$ ls
dir1  dir2  dirM
/tmp/test$ mv * dirM/
mv: cannot move `dirM' to a subdirectory of itself, `dirM/dirM'
或者如果您没有使用bash

mv $(ls -d * | grep -v ^dirM$) dirM
那么:

/tmp/test$ ls
dir1  dir2  dirM
/tmp/test$ mv * dirM/
mv: cannot move `dirM' to a subdirectory of itself, `dirM/dirM'
或者如果您没有使用bash

mv $(ls -d * | grep -v ^dirM$) dirM

你不用说你用的是什么外壳。在符合POSIX标准的
sh
中,您可以跳过
dirM
,循环目录的内容:

mv `ls -d * | grep -v ^dirM$` dirM
for d in ./*/; do
    [ ! -d "$d" ] || [ "$d" -eq "./dirM/" ] && continue
    mv "$d" dirM
done
bash
中,可以使用扩展模式来匹配除
dirM
之外的所有模式:

mv `ls -d * | grep -v ^dirM$` dirM
for d in ./*/; do
    [ ! -d "$d" ] || [ "$d" -eq "./dirM/" ] && continue
    mv "$d" dirM
done
无论哪种情况,如果您只是想隐藏错误,请使用

shopt -s extglob nullglob
for d in !(dirM)/; do
    mv "$d" dirM
done

不建议这样做,因为它将丢弃可能发生的任何错误。

您不会说您正在使用什么shell。在符合POSIX标准的
sh
中,您可以跳过
dirM
,循环目录的内容:

mv `ls -d * | grep -v ^dirM$` dirM
for d in ./*/; do
    [ ! -d "$d" ] || [ "$d" -eq "./dirM/" ] && continue
    mv "$d" dirM
done
bash
中,可以使用扩展模式来匹配除
dirM
之外的所有模式:

mv `ls -d * | grep -v ^dirM$` dirM
for d in ./*/; do
    [ ! -d "$d" ] || [ "$d" -eq "./dirM/" ] && continue
    mv "$d" dirM
done
无论哪种情况,如果您只是想隐藏错误,请使用

shopt -s extglob nullglob
for d in !(dirM)/; do
    mv "$d" dirM
done

不建议这样做,因为它将丢弃可能发生的任何错误。

可以这样做

mv * dirM 2> /dev/null
-type d-not-name'dirM'
#查找除dirM以外的所有目录


exec mv{}'dirM'
#将这些目录移动到dirM

可以这样做

mv * dirM 2> /dev/null
-type d-not-name'dirM'
#查找除dirM以外的所有目录


exec mv{}'dirM'
#将这些目录移动到dirM

由于我的旧答案被否决,下面是另一个。比其他的都好

find  -type d  -not -name 'dirM' -exec mv {} 'dirM' \; 
不解析ls。 在版本4.1-1下测试

mv !(dirM) DirM

既然我的旧答案被否决了,下面是另一个答案。比其他的都好

find  -type d  -not -name 'dirM' -exec mv {} 'dirM' \; 
不解析ls。 在版本4.1-1下测试

mv !(dirM) DirM


这不管用吗?dir1和dir2应该在dirM中。您只想删除错误消息?您的命令正是这样做的。它还抱怨试图将目录移动到它自己,但除此之外,它做得很好。
/tmp/test$mv dir[12]dirM/
使用
'*'
你试图
mv dirM dirM
提示错误……是的,它做得很好,我试图避免错误。避免还是隐藏?如果你说
mv。。。。2> /dev/null
您将看不到它。这不起作用吗?dir1和dir2应该在dirM中。您只想删除错误消息?您的命令正是这样做的。它还抱怨试图将目录移动到它自己,但除此之外,它做得很好。
/tmp/test$mv dir[12]dirM/
使用
'*'
你试图
mv dirM dirM
提示错误……是的,它做得很好,我试图避免错误。避免还是隐藏?如果你说
mv。。。。2> /dev/null
您将看不到它。您还需要删除它。从列表中删除-不是名字。“A”犯了个错误,当我试图撤销它时,它不允许我。我想把它放在我自己的帖子上。你也需要删除它。从列表中删除-不是名字。“A”犯了个错误,当我试图撤销它时,它不允许我。我想在自己的帖子中使用它。在bash版本4.1-1中进行测试时,只有启用了
extglob
shopt-s extglob
),并且默认情况下关闭了它,才能使用它。我猜您应该在您的点文件中启用它,但是@Krish没有。只有在启用了
extglob
shopt-s extglob
)并且默认情况下它是关闭的情况下,bash版本4.1-1中测试的@Krish才有效。我猜你在你的点文件中启用了它,但是@Krish没有。