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