我想知道 - 如何将目录中的所有文件移动到特定目录中的那些文件之外(因为'mv'没有'--exclude'选项)?
答案 0 :(得分:65)
让我们假设dir结构就像,
|parent
|--child1
|--child2
|--grandChild1
|--grandChild2
|--grandChild3
|--grandChild4
|--grandChild5
|--grandChild6
我们需要移动文件,使其看起来像,
|parent
|--child1
| |--grandChild1
| |--grandChild2
| |--grandChild3
| |--grandChild4
| |--grandChild5
| |--grandChild6
|--child2
在这种情况下,您需要排除两个目录child1
和child2
,并将其余目录移至child1
目录。
使用,
mv !(child1|child2) child1
这会将所有其余目录移动到child1
目录。
答案 1 :(得分:3)
由于find确实有一个exclude选项,因此请使用find + xargs + mv:
find /source/directory -name ignore-directory-name -prune -print0 | xargs -0 mv --target-directory=/target/directory
请注意,这几乎是从查找手册页复制的(我认为使用mv --target-directory比cpio更好)。
答案 2 :(得分:1)
这不是你要求的,但它可能会起作用:
mv the-folder-you-want-to-exclude somewhere-outside-of-the-main-tree
mv the-tree where-you-want-it
mv the-excluded-folder original-location
(基本上,将排除的文件夹移出要移动的较大树。)
所以,如果我有a/
并且我想要排除a/b/c/*
:
mv a/b/c ../c
mv a final_destination
mkdir -p a/b
mv ../c a/b/c
或类似的东西。否则,您可能会find
帮助您。
答案 3 :(得分:1)
这会将当前目录下或不在./exclude/目录中的所有文件移动到/ wherever ...
find -E . -not -type d -and -not -regex '\./exclude/.*' -exec echo mv {} /wherever \;
答案 4 :(得分:1)
首先获取文件和文件夹的名称,并排除所需的任何内容:
ls --ignore=file1 --ignore==folder1 --ignore==regular-expression1 ...
然后将经过过滤的名称传递给mv
作为第一个参数,第二个参数将成为目的地:
mv $(ls --ignore=file1 --ignore==folder1 --ignore==regular-expression1 ...) destination/
答案 5 :(得分:0)
#!/bin/bash
touch apple banana carrot dog cherry
mkdir fruit
F="apple banana carrot dog cherry"
mv ${F/dog/} fruit
#这将从列表F中删除“狗”,因此它保留在 当前目录,但未移至“水果”
答案 6 :(得分:0)
ls | grep -v exclude-dir | xargs -t -I '{}' mv {} exclude-dir
答案 7 :(得分:0)
mv * exclude-dir
对我来说是完美的解决方案
答案 8 :(得分:0)
重命名您的目录以使其隐藏,以便通配符看不到它:
mv specific_dir .specific_dir
mv * ../other_dir