如何使用bash列出目录中的文件?

48

如何将目录中仅为普通文件(忽略子目录和链接)的文件复制到相同目标?(在Linux上使用bash) 有大量的文件


4
这个为什么不是相关话题?我真的很讨厌 stackoverflow 的这部分。 - steinybot
我怀疑这是因为这应该属于像超级用户这样的东西,我有点理解,但同时这也是一个合法的bash编程问题。 - Azuaron
你能否重新表达标题...这是如何复制,而不是如何列出。 - Tim Boland
3个回答

77
for file in /source/directory/*
do
    if [[ -f $file ]]; then
        #copy stuff ....
    fi
done

它也不会尊重文件名中带有空格的文件。 - glenn jackman
1
@holygeek:不,globbing(路径名扩展)不受ARG_MAX最大命令行长度限制的影响,因为没有涉及到外部实用程序。话虽如此,在Bash中具有大量迭代次数的任何循环都会变得_缓慢_. - mklement0
1
@glennjackman:由于使用[[ ... ]]而不是[ ... ],因此可以正确处理带有空格的文件名;在大多数情况下,[[ ... ]]不需要对变量引用进行双引号引用。 - mklement0

29

列出 /my/sourcedir/ 中的常规文件,不递归查找子目录:

find /my/sourcedir/ -type f -maxdepth 1

将这些文件复制到 /my/destination/

find /my/sourcedir/ -type f -maxdepth 1 -exec cp {} /my/destination/ \;

谢谢 :). 我想添加 * 以获取源目录中的所有文件列表。find /data/* -maxdepth 2 -type f - Anum Sheraz

9

为了进一步说明 poplitea的回答,你不必为每个文件执行cp命令:可以使用xargs同时复制多个文件:

find /my/sourcedir -maxdepth 1 -type f -print0 | xargs -0 cp -t /my/destination

或者

find /my/sourcedir -maxdepth 1 -type f -exec cp -t /my/destination '{}' +

1
"-exec ... +" 是最有效的解决方案;值得一提的是:cp -tGNU 扩展。 - mklement0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接