如何在Unix中仅移动文件


18

如何使用mv命令将纯文件(而不是目录)从Linux中的一个文件夹移动到另一个文件夹?

我已经尝试过mv * ~/,但是它复制了包括目录在内的所有内容。


您的评论中提到了一个附加限制:该命令不应从当前工作目录中移动隐藏文件。如果这是正确的,您可以编辑您的问题以提及此吗?说“仅移动文件”会使我们认为“移动所有文件”,其中包括隐藏文件。
魁北克吉ote德09年

Answers:


29

你可以试试

find . -maxdepth 1 -type f -exec mv {} destination_path \;

2
哇,知道如何使用的人找到了。为了完整起见,应在查找中使用-name [^。] *,即--- find。-maxdepth 1 -type f -name [^。] * -exec mv {} path \;
克里斯,

请勿将其复制粘贴到您的外壳中。分号将使其立即执行。:)
Sherwood Callaway

@SherwoodCallaway分号标志着-exec
dstonek '19

4

我是一个“用锤子做所有事情”的家伙,所以我用bourne shell程序做其他事情,而用外部程序做...

for file in * .* 
do
  test -f "$file" && mv "$file" "$HOME"/
done

有些人喜欢用尽可能少的打字方式来完成工作,但是我是一个非常快速的打字员,我的大脑已经内置了类似的东西,所以这样做而不是查找确切的字眼并不是一件很痛苦的事情。查找和执行等参数。

YMMV,不过...


谢谢你,我会尝试的。但是我仍然需要另一个答案,因为它是我在linux课程中所做的一个项目。非常感谢

1
对您问题的答案。mv不了解文件或目录,fifos或其他特殊文件。mv仅了解目录项和索引节点,就文件而言,无论文件类型如何,它们都相同。要允许mv仅移动特定类型的文件,您需要诸如test或find之类的东西,它们实际上可以查看inode以查看文件是什么。换句话说,如果要求您使用mv 询问您一个技巧问题。
克里斯,

1
我说mv理解inode 只是因为它能够将文件从一个文件系统移动到另一个文件系统,从技术上来说,这是cp然后是rm,而不是mv(实际上只是ln然后是rm)。查看硬链接和目录条目。
克里斯,

2
shorty:这是一个很好的答案,除了mv命令(至少是shell),您还必须使用其他东西。这是一个基本的知识,无需编程即可获取。
凯尔·布​​兰特

3

@Mereghost非常接近。这是移动所有文件(包括隐藏文件)但不移动目录的结果:

find . -maxdepth 1 -type f -name '*' -exec mv -n {} /destination_path \;

.后发现假定您的当前目录是要移动的文件的来源。如果没有,则可以修改该命令,如下所示:

find /source_path -maxdepth 1 -type f -name '*' -exec mv -n {} /dest_path \;

如果只想移动普通文件而不移动隐藏文件:

find . -maxdepth 1 -type f -name '[!.]*' -exec mv -n {} /dest_path \;

如果只想移动隐藏文件而不移动普通文件:

find . -maxdepth 1 -type f -name '.*' -exec mv -n {} /dest_path \;

0

如果您没有名称带点的文件夹,则可以简单地移动所有文件夹:

MV 〜/目的地文件夹

(我的假设是您的所有文件都是某物(以我为例,通常都是这样))

但感谢其他答案-非常有帮助。谢谢


-1

您可以使用查找

find * -maxdepth 1 -type f -exec mv {} ~ \;

是的,它可以正常工作,但不能100%将所有文件从目录和子目录复制到〜/位置。我只需要一个非常基本的东西,即可将文件(不包含隐藏文件)从我所在的目录复制到另一个目录。而已。无论如何,谢谢您的建议

这是不可能的MAXDEPTH为1
约翰牛逼

已修复,因此不会复制隐藏文件。
约翰T

1
find的语法是find,然后是目录,然后是操作和要匹配的事物的描述。如果不保护通配符(例如find / path / to / directory -name goo * -type f),通常不会使用诸如find *之类的通配符。–
chris

1
仅当您将查找路径交给一个检查路径时,“查找”才能正常工作。例如,在您的示例中,如果有任何以-开头的文件,则find会意外爆炸。只用一个程序读取目录条目总是总好得多,在您的示例中,您还可以使用两个不同的程序(find和shell)。
克里斯,

-2

mv`find ./sourcedir/* -type f` ./destdir


2
对于名称中包含空格的任何文件,此操作将失败。除非可以确保正确定界,否则绝不应该分析输出文件名的命令的输出。请参阅为什么不应该解析ls(1)的输出以获得主要思想。使用find-exec选项是避免此问题的最佳方法。
slhck
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.