移动除一个文件外的所有文件


154

如何移动除一个以外的所有文件?我正在寻找类似的东西:

'mv ~/Linux/Old/!Tux.png ~/Linux/New/'

我将旧资料移到新资料夹的位置,除了Tux.png。!符号表示否定。有一些工作工具吗?

Answers:


142

如果您使用bash并设置了extglobshell选项(通常是这种情况):

mv ~/Linux/Old/!(Tux.png) ~/Linux/New/

1
当我测试许多项目的命令时,我出了点问题:mv〜/ Linux / Old /!(Tux.png Tux1.png Tux2.png)〜/ Linux / New /它清空了整个Old目录。怎么了?
莱奥波德·赫兹(LéoLéopoldHertz),2009年

5
@UnixBasics,尝试:〜/ Linux / Old /!(Tux.png | Tux1.png | Tux2.png)
Juliano,

@Juliano非常酷的命令!还有更多的数学运算,例如OR和XOR吗?我假设管道用于AND。
莱奥波德·赫兹(LéoLéopoldHertz),2009年


@Juliano我对以下模式感到困惑:mv〜/ Linux /?(Tux * .png)〜/ Linux / New / mv〜/ Linux / +(Tux * .png)〜/ Linux / New / ,我想移动0-1 Tux-照片。在后者中,我想移动1-n Tux照片。他们动了一切。为什么?是否可以移动特定数量的照片?
莱奥列奥波尔德·赫兹준 영

97

将以下内容放入您的.bashrc

shopt -s extglob

它扩展了正则表达式。然后,您可以移动除一个以外的所有文件

mv !(fileOne) ~/path/newFolder

与其他命令有关的异常

请注意,在复制目录中,不能以线程中注意到的名称使用前向闪存

cp -r !(Backups.backupdb) /home/masi/Documents/

因此Backups.backupdb/在否定之前这里是错误的,并且我不会在移动目录中使用它,因为存在将错误的glob与其他命令一起使用以及可能出现其他异常的风险。


3
这实际上是正确的答案。我的错是错的。幸运的是,我在只有几个文件的文件夹中使用了它。这是有关Masi显示的方法的更多信息:wiki.bash-hackers.org/syntax/pattern转到“扩展模式语言”,您将找到有关此信息的更多信息。感谢@ paul-whittaker指出了这个问题。
mimoralea 2014年

这是一个旧答案,但仍然有效。我正在使用Ubuntu 18,并且extglob似乎默认情况下处于启用状态(我没有购物)。我使用以下命令将当前目录中的所有文件移动到该目录下的归档文件中,其中不包括任何其他归档文件文件夹: mv !(arc*) archive_190629b
TonyG

70

我会使用传统的find&xargs方法:

find ~/Linux/Old -maxdepth 1 -mindepth 1 -not -name Tux.png -print0 | 
    xargs -0 mv -t ~/Linux/New

-maxdepth 1使其无法递归搜索。如果您只关心文件,则可以说-type f-mindepth 1使其不将~/Linux/Old路径本身包括到结果中。适用于任何文件名,包括包含嵌入式换行符的文件名。

有一条评论指出,mv -t选项可能是GNU扩展。对于没有它的系统

find ~/Linux/Old -maxdepth 1 -mindepth 1 -not -name Tux.png \
    -exec mv '{}' ~/Linux/New \;

1
受到鼓励,因为它鼓励学习强大的工具find。请注意,对于带有空格的文件,此功能将无效。考虑“查找-print0 | xargs -0”,否则放弃xargs:“查找[您说的内容-exec mv -t {}〜/ Linux / New \;“
JasonSmith,2009年

如果您的mv命令没有-t选项,则使用“查找... -exec mv {} Linux / New \;”。或“查找... | xargs -I {} mv {} Linux / New”。-t选项似乎是GNU扩展名,对Linux来说很好,但在其他地方可能不行。
罗伯·肯尼迪

jhs,哦,我失败了。我以某种方式认为xargs在换行符处分开,但不在空格处分开。看起来我将其与“读取”混淆了:)不能解决它
Johannes Schaub-litb

非常感谢您的提示!我打算选择某物,因为它针对的是问题。但是,稍后我会感觉到您的命令的用处,因此我必须选择“查找和xargs”方式。它只是岩石。谢谢:)
莱奥列奥波尔德·赫兹준 영

方式复杂。Masi答案更完整,更容易,因此更正确
user637338

30

一种快速的方法是修改无尾礼服的文件名,以便您的移动命令不匹配。

例如:

mv Tux.png .Tux.png

mv * ~/somefolder

mv .Tux.png Tux.png

不要使用“ ”,因为那样只会移动带有“。”的文件。在名字里。只需“ *”就足够了。
朱利诺2009年

1
如果将其更改为*,也会删除重命名的文件。
约翰T

6
@John T:否,* glob与以点开头的文件不匹配。
Bill Karwin 09年

到目前为止,这是最好的答案。无需更改或评论此答案。100分 非常感谢。做得好!
史蒂夫·K

22

我认为最简单的方法是反引号

mv `ls -1 ~/Linux/Old/ | grep -v Tux.png` ~/Linux/New/

编辑:

请使用反斜杠与ls一起使用,以防止将其与别名一起使用,即,大多数ls被别名为ls --color。

mv `\ls -1 ~/Linux/Old/ | grep -v Tux.png` ~/Linux/New/

谢谢@Arnold Roa


1
您能解释一下为什么在这里使用grep -v吗?
莱奥列奥波尔德·赫兹준 영

grep中的-v选项排除了结果,就像除Tux.png之外,采取其他所有措施
Rohail Abbas 16/12/23

1
这当然很直观,但是上面的答案更好。如果你正在编写一个脚本,例如,这可能需要你在正确的目录..
nJGL

@nJGL我们也可以在此处给出绝对路径,因为问题有此内容,我使用了homedirectory(〜)
Rohail Abbas

@RohailAbbas足够公平。✌️
nJGL

14

对于bash来说,某些答案是正确的。这是zsh(我的首选外壳)语法:

mv ~/Linux/Old/^Tux.png ~/Linux/New/

需要EXTENDED_GLOB设置外壳选项。


3
如果我们要排除两个文件怎么办?
mpen

13

我发现这样做对于排除某些文件或目录的简单移动会更安全,更容易依靠。

ls -1 | grep -v ^$EXCLUDE | xargs -I{} mv {} $TARGET

这是Busybox / ASH的最佳解决方案
Stuart Cardall

1
这在我不得不将除少数文件夹以外的所有文件都移动到另一个目录的情况下对我
有用

-l选项ls将在命令行上包含很多不相关的信息,并导致mv命令失败。
jdhao

5

以下不是100%保证的方法,完全不应尝试编写脚本。但是有时候对于快速交互使用shell来说已经足够了。像这样的文件文件

[abc]*

(将匹配名称以a,b或c开头的所有文件)(可通过先插入“ ^”字符来取反),即

[^abc]*

我有时用它来匹配“ lost + found”目录,例如:

mv /mnt/usbdisk/[^l]* /home/user/stuff/.

当然,如果还有其他以l开头的文件,我必须在之后处理这些文件。


4
mv `find Linux/Old '!' -type d | fgrep -v Tux.png` Linux/New

find命令列出所有常规文件,而fgrep命令过滤掉所有Tux.png。反引号告诉mv移动结果文件列表。


4
永远不要将find作为另一个命令的参数进行评估。坏事会发生。您可能刚刚创建了一个漏洞。始终使用find -print0 | xargs -0构造,或查找-exec。

3

您如何移动文件夹中的所有内容,然后仅将Tux.png移回?

我想不出任何shell语法可以立即表达“除...以外的所有内容”。


3
ls ~/Linux/Old/ | grep -v Tux.png | xargs -i {} mv ~/Linux/New/'

1
该命令似乎缺少一部分,在我的计算机中不起作用。ls ~/Linux/Old/ | grep -v Tux.png | xargs -I{} mv {} ~/Linux/New/相反。
陈慧琳

3

怎么样:

mv $(echo * | sed s:Tux.png::g) ~/Linux/New/

但是您必须在文件夹中。


3

可以这样跳过grep

ls ~/Linux/Old/ -QI Tux.png | xargs -I{} mv ~/Linux/Old/{} ~/Linux/New/

1

这可能更容易记住,并且对我有用。

mv $(ls ~/folder | grep -v ~/folder/exclude.png) ~/destination

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.