我想知道如何移动目录中除特定目录外的所有文件(由于'mv'命令没有'--exclude'选项)?
|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
目录中。extglob
。您可以使用 shopt -s extglob
命令来启用它(如果您想要默认开启 extended globs
,您可以将 shopt -s extglob
添加到 .bashrc 中)。 - Boris D. Teoharovmv -f
似乎不起作用。我通过创建一个临时目录来解决它,这样总共有三个目录,然后移动所有目录,最后删除临时目录。很丑陋! - Michahellmv !(child1/) grandChild*
,则此方法将无法正常工作 - 要排除的目录名称不得包含尾部斜杠! - Jo Mo由于find命令有排除选项,因此可以使用find + xargs + mv命令:
find /source/directory -name ignore-directory-name -prune -print0 | xargs -0 mv --target-directory=/target/directory
首先获取文件和文件夹的名称,并排除您不需要的内容:
ls --ignore=file1 --ignore==folder1 --ignore==regular-expression1 ...
然后将筛选过的名称作为第一个参数传递给 mv
,第二个参数将是目标位置:
mv $(ls --ignore=file1 --ignore==folder1 --ignore==regular-expression1 ...) destination/
这并不完全符合您的要求,但可能可以胜任:
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
来帮助您。
mv specific_dir .specific_dir
mv * ../other_dir
这将移动当前目录及其子目录中不在./exclude/目录中的所有文件到/wherever...
find -E . -not -type d -and -not -regex '\./exclude/.*' -exec echo mv {} /wherever \;
ls | grep -v exclude-dir | xargs -t -I '{}' mv {} exclude-dir
ls
命令列出文件,并按以下方式对其进行过滤:ls | egrep -v '(dir_name|file_name.ext)'
然后,您可以运行以下命令来移动文件,但排除特定的文件:
mv $(ls | egrep -v '(dir_name|file_name.ext)') target_dir
假设你的目录是
.
├── dir1
│ └── a.txt
├── dir2
│ ├── b.txt
│ └── hello.c
├── file1.txt
├── file2.txt
└── file3.txt
你需要将file1 file2 file3
放入dir2
中。
你可以使用mv $(ls -p | grep -v /) /dir2
来完成它,因为
ls -p | grep -v /
会打印出当前工作目录中除了目录以外的所有文件。
#!/bin/bash
touch apple banana carrot dog cherry
mkdir fruit
F="apple banana carrot dog cherry"
mv ${F/dog/} fruit
# 这将从列表F中删除“dog”,因此它仍然在当前目录中,而不是移动到“fruit”