假设我有一个具有唯一名称的文件(例如截图20180509143013.png)我希望将其复制到/media/SD256。
文件/media/drive1/Users/name/Pictures/Screenshots/Screenshot20180509143013.png纠结于某些子目录级别,我不希望导航到/media/drive1/用户/名称/图片/屏幕截图/找到具有唯一名称的文件。
相反,我希望在我的工作目录为 /media/drive1/ 时运行命令,它看起来类似于:
copy --find-filename-then-copy Screenshot20180509143*3.png /dev/media/SD256/DestinationFolder
有没有这样的命令可以先找到文件然后复制?
答案1
使用find
:
find . -type f -name Screenshot20180509143013.png -exec cp {} /dev/media/SD256/DestinationFolder ';'
这将找到当前目录中或当前目录下的所有常规文件,其名称正是Screenshot20180509143013.png
.找到的文件将被复制到/dev/media/SD256/DestinationFolder
.如果有多个同名文件(您说没有),这些文件将在目标目录中相互覆盖。
答案2
与zsh
or 或fish
or ksh -o globstar
(bash -O globstar
或shopt -s globstar
在 中之后bash
)或在ortcsh
之后:set globstar
yash -o extended-glob
cp -- **/Screenshot20180509143*3.png /dev/media/SD256/DestinationFolder
globstar,使用**
语法,进行递归搜索;如果 glob 的其余部分(文件名模式)是唯一的,那么您将得到您想要的结果。请注意,我从您的示例中复制了,而不是问题前面的...3*3
eg 文件名。Screenshot20180509143013.png
注意:
fish
4.3 之前的 bash 版本在递归时将遵循符号链接。使用zsh
,tcsh
或yash
,您可以使用***
代替来**
获得该行为。fish
如果该文件位于当前目录中,则不会找到该文件。- 隐藏文件和隐藏目录中的文件将不被考虑。许多 shell 都有
dotglob
重新启用它们的选项。另请参阅(D)
中的 glob 限定符zsh
。 - 您
zsh
可能还想([1])
在模式的末尾添加。[1]
是一个全局限定符,仅复制第一的匹配文件。 - 如果在多个目录中找到该文件,则该
-i
选项还可以防止意外覆盖。cp
答案3
中兴
如果您正在使用zsh
,则可以使用cp
withzsh
的通配符:
cp **/Screenshot20180509143013.png /dev/media/SD256/DestinationFolder
**/Screenshot20180509143013.png
Screenshot20180509143013.png
将尝试从当前目录递归查找。
一般用途
出于一般目的,您始终可以使用find
+ cp
:
cp "$(find ./ -type f -name "<picture_name>" )" "<destination>"
find
- 搜索文件。
./
- 在当前目录中搜索。
-type f
- 限制对常规文件的搜索。
-name "<picture_name>"
- 搜索具有名称的文件<picture_name>
(*
in<picture_name>
可用于匹配任何序列)
"$(find ./ -type f -name "<picture_name>" )"
- 将这部分代码替换为stdout
offind
命令。
cp "$(find ./ -type f -name "<picture_name>" )" <destination>
- 将文件的路径复制"$(find ./ -type f -name "<picture_name>" )"
到<destination>
。