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

时间:2015-11-02 21:12:24

标签: linux shell

/tmp/test$ ls
dir1  dir2  dirM
/tmp/test$ mv * dirM/
mv: cannot move `dirM' to a subdirectory of itself, `dirM/dirM'

有没有办法使用shell脚本将所有内容(除了dirM)移动到dirM?

4 个答案:

答案 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