复制具有一定长度文件名的所有文件

Ada*_*m_G 3 bash filenames file-copy files

在 directory 中,/source我想将文件名超过 15 个字符的所有文件复制到 directory /dest。是否有 UNIX 命令可以执行此操作?

编辑:虽然这个问题解释了如何搜索特定长度的文件名,但我的问题还询问如何复制文件。

小智 9

据我所知,没有专门执行此操作的命令,但您可以利用 shell glob 模式:

cp /source/????????????????* /dest
Run Code Online (Sandbox Code Playgroud)

星号前面有16 个问号(你说你想要“超过 15 个字符”,意思是“至少 16 个”)。

以下是对我当前答案的警告:

  • 根据您的 shell 配置,这可能不会复制“隐藏”文件(即以点 ( .)开头的文件)
  • 这不会复制/source. 它只会为每个文件名长度大于 15 个字符的目录发出警告。如果您想递归地复制下面的所有内容/source并保持层次结构,那么该答案将更加复杂。


Tho*_*key 6

您可以制作包含 16 个或更多字符的图案并复制这些文件。

一种简单(但不优雅)的方法,使用 16 个?字符,每个字符匹配任何单个字符:

for n in /source/????????????????*;do [ -f "$n" ] && cp "$n" /dest/; done
Run Code Online (Sandbox Code Playgroud)

在 16th 之后?,用于*匹配任意数量的字符。该模式可能并不真正匹配任何内容,因此-f仍需要进行测试以确保它是一个文件。

  • 在 bash 中,您还可以使用 nullglob shell 选项来避免测试是否存在任何此类文件。 (2认同)

jim*_*mij 6

该?????????????????????解决方案是好的,除非你和我一样,不能指望上述8。在这种情况下,您可以使用find:

find . -maxdepth 1 -regextype posix-egrep -regex '.{17,}' -exec cp -t /dest {} +
Run Code Online (Sandbox Code Playgroud)
  • 请注意,17应该用于考虑之前的./.
  • -regextype posix-egrep需要允许大括号{}模式。默认的正则表达式类型find是emacs,它不允许这样做。
  • 目的地应作为第一个cp参数(-t选项)放置,以便将所有输出{} +视为源。