【问题标题】:Bash file for moving files [closed]用于移动文件的 Bash 文件 [关闭]
【发布时间】:2020-06-30 00:37:39
【问题描述】:

我想移动一个扩展名为 .png 和 .jpg 的文件 我试过了:

mv ~/folder/*.png  ~/folder/folder2 

有没有一种方法可以在一行上执行多种文件类型,如下所示? (我试过了,但它显然无效)

mv ~/folder/*.png&&*jpg  ~/folder/folder2 

我知道我可以只写两行,但如果可能的话,我希望不那么冗长。

【问题讨论】:

  • *.@(png|jpg|jpeg|pdf|mp3|mp4)extglob 启用 shopt -s extglob 和可能 nullglob
  • mv ~/folder/*.{png,jpg} ~/folder/fold2
  • @Jetchisel globstar 不需要,只需使用大括号扩展即可。
  • Stack Overflow 用于编程问题,而不是关于使用或配置 Unix 及其实用程序的问题。 Unix & LinuxSuper User 将是解决此类问题的更好地方。
  • 顺便说一句,我总是建议使用 mv -imv -n 进行这样的批量/自动移动,因为没有 -i-n 选项,如果有命名冲突,它会静默且不可逆转地删除一些冲突文件。

标签: linux bash command line


【解决方案1】:

在 bash、zsh 和 ksh 中,您可以mv *.{png,jpg} folder2。不过,这在经典的 Bourne shell 中不起作用。

【讨论】:

    【解决方案2】:

    一般解决方案使用brace expansion:

    mv ~/folder/*.{png,jpg} ~/folder/folder2
    

    在将参数传递给mv 之前,Bash 会将其扩展为:

    mv ~/folder/*.png ~/folder/*.jpg ~/folder/folder2
    

    ...应该做你想做的事。

    (脚注:正如 JMW 指出的那样,Bash 还负责将 *.whatever 全局变量扩展为一系列文件名,因此实际上 mv 正在接收像 ~/folder/1.png ~/folder/2.png ~/folder/3.jpg ~/folder/folder2 这样的参数列表。大括号扩展和通配符在其中在将参数发送到您正在调用的任何程序之前,Bash 需要执行几个解析步骤。)

    【讨论】:

    • 实际上,这些星号也被扩展为一系列匹配文件,这些文件作为参数传递给 mv,除非没有匹配项,在这种情况下,可能会传递文字星号。大多数时候这可能并不重要,但值得明确的是,这些星号是由 shell 扩展的,而不是 mv。刚接触 shell 的人可能会感到困惑。当处理诸如 find 之类的工具时,它会变得更加混乱
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-14
    • 2017-02-01
    • 2017-08-30
    • 1970-01-01
    • 2014-08-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多