我想复制所有文件以两位数字开头,后跟下划线。我下面的代码没有将任何文件复制到该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/'
来自另一个壳。
使用bash
shell,您可以执行以下操作:
shopt -s extglob failglob
cp -R ~/KIRP/*(0)[123456789]?([0123456789])_* ~/KIRC/
匹配任意数量的0
s 后跟 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 如何处理结果。