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

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

在目录中,/source我想将文件名超过 15 个字符的所有文件复制到目录中/dest。有 UNIX 命令可以做到这一点吗?

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

答案1

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

cp /source/????????????????* /dest

16星号前面的问号(您声明您想要“超过 15 个字符”,这意味着“至少 16 个”)。

以下是我当前答案的注意事项:

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

答案2

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

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

for n in /source/????????????????*;do [ -f "$n" ] && cp "$n" /dest/; done

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

答案3

这个?????????????????????解决方案很好,除非你像我一样数不过八。在这种情况下你可以使用find

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

答案4

如果指的是带有 GNU、Gawk 的 Linux 系统,那么下面是一种解决方案。来源是/home/my_folder,复制到/dest文件名超过 7 个字符,假设文件名没有空格:

ls /home/my_folder/ |awk '{if(length($0)>7){print "cp /home/my_folder/"$0" /dest/"$0";";}}'

哪个输出:

cp /home/my_folder/orbit-antixcat /dest/orbit-antixcat;
cp /home/my_folder/spacefm-antixcat-569be3dc.tmp /dest/spacefm-antixcat-569be3dc.tmp;
cp /home/my_folder/xsession-modified-date /dest/xsession-modified-date;

如果看起来没问题,则通过 shell 进行管道传输以实际复制文件:

ls /home/my_folder/ |awk '{if(length($0)>7){print "cp /home/my_folder/"$0" /dest/"$0";";}}'|bash

可以添加一些引号来容纳名称中带有空格的文件:

ls /home/my_folder |awk '{if(length($0)>7){print "cp \047/home/my_folder/"$0"\047 \047/dest/"$0"\047;";}}'|bash

带引号的输出示例:

cp '/home/my_folder/kdecache-antixcat' '/dest/kdecache-antixcat';
cp '/home/my_folder/ksocket-antixcat' '/dest/ksocket-antixcat';

如果碰巧有别名,可以指定 cp 二进制文件;也许覆盖时会出现您不想要的确认。

ls /home/my_folder |awk '{if(length($0)>2){print "/bin/cp \047/home/my_folder/"$0"\047 \047/dest/"$0"\047;";}}'|bash

如果需要的话可以修改上面的内容来复制目录;目前它们被省略了。

相关内容