/tmp/test$ ls
dir1 dir2 dirM
/tmp/test$ mv * dirM/
mv: cannot move `dirM' to a subdirectory of itself, `dirM/dirM'
有没有办法使用shell脚本将所有内容(除了dirM)移动到dirM?
答案 0 :(得分:2)
你不会说你正在使用什么样的外壳。在符合POSIX的sh
中,您可以循环遍历目录的内容,跳过dirM
:
for d in ./*/; do
[ ! -d "$d" ] || [ "$d" -eq "./dirM/" ] && continue
mv "$d" dirM
done
在bash
中,您可以使用扩展模式匹配dirM
以外的所有模式:
shopt -s extglob nullglob
for d in !(dirM)/; do
mv "$d" dirM
done
在任何一种情况下,如果您只是想隐藏错误,请使用
mv * dirM 2> /dev/null
建议不要这样做,因为它会丢弃可能发生的任何错误。
答案 1 :(得分:0)
可以这样做
find -type d -not -name 'dirM' -exec mv {} 'dirM' \;
-type d -not -name 'dirM'
#find除dirM以外的所有目录
exec mv {} 'dirM'
#将这些目录移至dirM
答案 2 :(得分:0)
由于我的旧答案被否决,这是另一个。比其他所有人都好。
mv !(dirM) DirM
不解析ls。 在4.1-1版本下测试
!(pattern-list)
Matches anything except one of the given patterns
https://www.gnu.org/software/bash/manual/html_node/Pattern-Matching.html#Pattern-Matching
答案 3 :(得分:-2)
怎么样:
mv $(ls -d * | grep -v ^dirM$) dirM
或者如果你没有使用bash
mv `ls -d * | grep -v ^dirM$` dirM