Linux 如何使用';mv';命令以移动除特定目录中的文件以外的文件?

Linux 如何使用';mv';命令以移动除特定目录中的文件以外的文件?,linux,mv,Linux,Mv,我想知道-除了特定目录中的文件外,如何移动目录中的所有文件(因为“mv”没有“--exclude”选项)?这并不是您所要求的,但它可能可以完成以下任务: 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 (基本上,将排除的文件夹从要移动的较大树中移出。) 所以,如果我

我想知道-除了特定目录中的文件外,如何移动目录中的所有文件(因为“mv”没有“--exclude”选项)?

这并不是您所要求的,但它可能可以完成以下任务:

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
的帮助。

因为find有一个排除选项,所以请使用find+xargs+mv:

find /source/directory -name ignore-directory-name -prune -print0 | xargs -0 mv --target-directory=/target/directory

请注意,这几乎是从查找手册页复制的(我认为使用mv--target directory比cpio更好)。

这将把当前目录下的所有文件(不在./exclude/目录下)移动到/无论何处

find -E . -not -type d -and -not -regex '\./exclude/.*' -exec echo mv {} /wherever \;

假设dir结构是这样的

|parent
    |--child1
    |--child2
    |--grandChild1
    |--grandChild2
    |--grandChild3
    |--grandChild4
    |--grandChild5
    |--grandChild6
我们需要移动文件,使其看起来像

|parent
    |--child1
    |   |--grandChild1
    |   |--grandChild2
    |   |--grandChild3
    |   |--grandChild4
    |   |--grandChild5
    |   |--grandChild6
    |--child2
在这种情况下,您需要排除两个目录
child1
child2
,并将其余目录移动到
child1
目录中

#!/bin/bash

touch apple  banana  carrot  dog  cherry

mkdir fruit

F="apple  banana  carrot  dog cherry"

mv ${F/dog/} fruit
使用

这将把所有其余目录移到
child1
目录中

#!/bin/bash

touch apple  banana  carrot  dog  cherry

mkdir fruit

F="apple  banana  carrot  dog cherry"

mv ${F/dog/} fruit
#这将从列表F中删除“dog”,因此它将保留在 当前目录,未移动到“水果”

ls | grep -v exclude-dir | xargs -t -I '{}' mv {} exclude-dir

是我的完美解决方案

首先获取文件和文件夹的名称,然后排除任何您想要的:

ls --ignore=file1 --ignore==folder1 --ignore==regular-expression1 ...
然后将过滤后的名称作为第一个参数传递给
mv
,第二个参数将作为目标:

mv $(ls --ignore=file1 --ignore==folder1 --ignore==regular-expression1 ...) destination/

重命名目录使其隐藏,以便通配符看不到它:

mv specific_dir .specific_dir 
mv * ../other_dir

查看此技巧:但是请注意,使用此模式依赖于
extglob
。您可以使用
shopt-s extglob
启用它(如果您希望在默认情况下启用
extended globs
,您可以将
shopt-s extglob
添加到.bashrc)我一直得到
-bash:!:尝试执行此命令时未找到事件。Derp,刚刚意识到上面的注释是bash所必需的。如何强制执行此操作?当除了被忽略的目录之外没有其他目录时
mv-f
似乎不起作用。我通过创建一个临时目录来解决这个问题,这样总共有三个目录,然后移动所有目录,然后删除临时目录。丑!小心这一个,你真的希望所有的东西在该目录中的另一个目录!这将忽略目录结构,并将子目录中的所有文件复制到一个平面文件夹结构中。a/b/c/->/where a/b.txt->/where veri获得了
未知谓词'-E'
,您要移动的文件是否在根目录中?例如,一些系统只允许用户访问一个目录(一些云IDE就是一个很好的例子)。也许有人想把所有东西都移动到一个子目录。这是行不通的。正如我(六年前)所说的,答案并没有准确描述要求的内容,它可能只起作用。在大多数情况下,它应该起作用;当然,你的是个例外。你是对的,它不是。但我的观点并不是说这不是人们所要求的,而是在某些情况下它不会起作用。我的例子只是一个假设来证明这一点。您想对您的纯代码答案添加一些解释吗?这将有助于消除StackOverflow是免费代码编写服务的误解。另外,请查看此处以改善外观:
mv specific_dir .specific_dir 
mv * ../other_dir