Linux 在Shell中,如何将一个目录的内容移动到同一级别的另一个目录
是否有一种方法可以使用shell脚本将所有内容(除dirM外)移动到dirM?如何: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
/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没有。