将不同目录中的编号文件按正确顺序合并到同一目录中

将不同目录中的编号文件按正确顺序合并到同一目录中

我有一些名为 FOO 和 BAR 等的目录,其中包含以下形式的文件

  • 富/
    • 1.png
    • ...
    • 18.png
  • 酒吧/
    • 1.jpg
    • ...
    • 12.jpg
  • ...

我希望它们全部复制到目标目录中,以便

  • 目的地/
    • 1.png
    • ...
    • 18.png
    • 19.jpg
    • ...
    • 30.jpg
    • ...

我正在寻找一个可以执行此操作的 bash 别名或函数。
输入应该是这样的,function DESTINATION FOO BAR etc
如果有目标目录使得函数过于复杂,那么请回答将当前目录视为目标的函数,因此function FOO BAR etc

我现在制作了下面的脚本,它可以正常工作,但前提是所有图片都是 png 并且文件夹名称中没有空格。
如果有人对如何修复这些错误或如何以任何方式改进代码有任何建议,请告诉我。

#!/bin/bash
counter=1;
destination=$1;
for folder in "${@:2}"
do
    for picture in $folder/*.png
    do
        cp $picture $destination/$counter.png; 
        let counter=counter+1;
    done
done

答案1

它可以正常工作,但前提是所有图片都是 png,并且文件夹名称中没有空格。

后一个缺陷很常见,其解决方案是已知的:引用正确. 习惯使用双引号。

为了使脚本与多个扩展配合良好,请启用nullglobnocaseglob和(最重要的)extglob;然后使用类似的模式*.@(jpg|png|bmp)

稍后要识别扩展名,请使用${parameter##*.}

下面的代码也使用--对于cp,以防万一任何$folder扩展为以 开头的字符串-

你的脚本将会变成这样:

#!/bin/bash
shopt -s extglob nullglob nocaseglob
counter=1
destination="$1"
for folder in "${@:2}"
do
    for picture in "$folder"/*.@(jpg|jpeg|png|bmp|gif|tiff)
    do
        cp -- "$picture" "$destination/$counter.${picture##*.}" 
        let counter=counter+1;
    done
done

*请注意,在通配符模式中(例如你的*.png或我们的) ,结果的顺序*.@(jpg|jpeg|png|bmp|gif|tiff)取决于LC_COLLATE,但它始终是按字典顺序排列的(我的意思是在 Bash 中,例如Zsh 可以更智能)。GUI 文件管理器可能关心数字并1.png在 之前排序18.png,但我们的脚本将在 之前排序18.png(从源目录,如您的FOO1.png。这意味着在您的示例中,文件DESTINATION/1.png将是 的副本FOO/11.png,而不是 的副本FOO/1.png

您的原始脚本同样存在“缺陷”,但您仍然没有将此视为问题,因此我的脚本不会尝试“修复”这个问题。

相关内容