如何复制名称以子字符串开头的文件?

如何复制名称以子字符串开头的文件?

我想复制所有文件以两位数字开头,后跟下划线。我下面的代码没有将任何文件复制到该KIRC文件夹​​。

cp -R  ~/KIRP/[0-9][0-9]_* ~/KIRC/

文件夹内容示例KIRP

11_abc.py
9_efg.R
hij_12.csv

预期输出:11_abc.py 9_efg.R

答案1

9_efg.R与该模式不匹配,因为 之前只有一位数字_11_abc.py但确实如此。也许您在fish不支持[...]glob 运算符的 shell 中进行了尝试。

如果您想要复制名称以 0 到 99 之间的数字开头,后跟的文件,_无论使用多少位数字来表示该数字(包括000_x, 1_y, 11_z),您可以使用 zsh shell,它具有 glob 运算符:

cp -R  ~/KIRP/<0-99>_* ~/KIRC/

或者

zsh -c 'cp -R  ~/KIRP/<0-99>_* ~/KIRC/'

来自另一个壳。

使用bashshell,您可以执行以下操作:

shopt -s extglob failglob
cp -R ~/KIRP/*(0)[123456789]?([0123456789])_* ~/KIRC/

匹配任意数量的0s 后跟 1 到 9 的数字([1-9]与 bash 不同,zsh 通常匹配数百个不同的字符)后跟 0 到 9 的可选数字。我们需要failglob避免复制文件*(0)[123456789]?([0123456789])_*如果没有匹配,则按字面命名。

请注意,对于类型的文件目录,以递归方式复制目录及其所有内容R。排除文件类型目录, 和zsh

cp ~/KIRP/<0-99>_*(^/) ~/KIRC/

(bash 没有等效项)。

或者复制在任何级别的子目录下找到的任何文件~/KIRP

cp ~/KIRP/**/<0-99>_*(D^/) ~/KIRC/

(删除D以排除隐藏目录中的内容)。

答案2

使用bash,您可以键入cp -R ~/KIRP/[0-9]?([0-9])_* ~/KIRC/。应该设置 extblob 选项(请参阅echo $BASHOPTS)。但这会复制文件和目录。

答案3

如果我理解正确,您只想将目录及其(嵌套)子目录中的“仅文件”复制到“平面”目录中。

这是一份工作find

marco@minestrone ~/temp [0]
$ ls -lhvF KIRP
insgesamt 0
-rw-r----- 1 marco marco 0 Feb 26 18:54 9_efg.R
-rw-r----- 1 marco marco 0 Feb 26 18:54 11_abc.py
-rw-r----- 1 marco marco 0 Feb 26 19:00 23_fdsjal.txt
-rw-r----- 1 marco marco 0 Feb 26 19:00 55_adwf.md
-rw-r----- 1 marco marco 0 Feb 26 18:54 hij_12.csv
marco@minestrone ~/temp [0]
$ ls -lhvF KIRC
insgesamt 0
marco@minestrone ~/temp [0]
$ find ~/temp/KIRP -type f -name "[0-9][0-9]_*" -exec cp {} ~/temp/KIRC \;
marco@minestrone ~/temp [0]
$ ls -lhvF KIRC
insgesamt 0
-rw-r----- 1 marco marco 0 Feb 26 19:01 11_abc.py
-rw-r----- 1 marco marco 0 Feb 26 19:01 23_fdsjal.txt
-rw-r----- 1 marco marco 0 Feb 26 19:01 55_adwf.md

where-type f 将搜索限制为文件,-name保存文件名的正则表达式并-exec告诉 find 如何处理结果。

相关内容