在目录中,/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
需要允许大括号{}
模式。默认正则表达式类型find
是emacs这不允许这样做。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
如果需要的话可以修改上面的内容来复制目录;目前它们被省略了。