如何在不导航到目录的情况下复制具有唯一名称的文件?

如何在不导航到目录的情况下复制具有唯一名称的文件?

假设我有一个具有唯一名称的文件(例如截图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

zshor 或fishor ksh -o globstarbash -O globstarshopt -s globstar在 中之后bash)或在ortcsh之后:set globstaryash -o extended-glob

cp -- **/Screenshot20180509143*3.png /dev/media/SD256/DestinationFolder

globstar,使用**语法,进行递归搜索;如果 glob 的其余部分(文件名模式)是唯一的,那么您将得到您想要的结果。请注意,我从您的示例中复制了,而不是问题前面的...3*3eg 文件名。Screenshot20180509143013.png

注意:

  • fish4.3 之前的 bash 版本在递归时将遵循符号链接。使用zsh,tcshyash,您可以使用***代替来**获得该行为。
  • fish如果该文件位于当前目录中,则不会找到该文件。
  • 隐藏文件和隐藏目录中的文件将不被考虑。许多 shell 都有dotglob重新启用它们的选项。另请参阅(D)中的 glob 限定符zsh
  • zsh可能还想([1])在模式的末尾添加。[1]是一个全局限定符,仅复制第一的匹配文件。
  • 如果在多个目录中找到该文件,则该-i选项还可以防止意外覆盖。cp

答案3

中兴

如果您正在使用zsh,则可以使用cpwithzsh的通配符:

cp **/Screenshot20180509143013.png /dev/media/SD256/DestinationFolder

**/Screenshot20180509143013.pngScreenshot20180509143013.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>" )"- 将这部分代码替换为stdoutoffind命令。

cp "$(find ./ -type f -name "<picture_name>" )" <destination>- 将文件的路径复制"$(find ./ -type f -name "<picture_name>" )"<destination>

相关内容