【问题标题】:Moving groups of files into sub-directories将文件组移动到子目录中
【发布时间】:2014-10-03 01:12:11
【问题描述】:

我有 30k+ 图像和许多包含这些图像的文件夹。我想要的是每个文件夹有 100 张图像。有谁知道可以帮助我解决这个问题的 Linux 程序/脚本?

最好我希望程序/脚本能够创建目录(即 images-001、images-002、images-003 等),然后放置 100 个图像(不同的扩展名 .gif .jpg .png .bmp 。 webm) 在每个文件夹中。

【问题讨论】:

  • 您打算如何将文件分区到文件夹中?随机?按名字?按类型?按目录输入顺序?
  • 随机我真正想要的是每个文件夹 100 个文件,这样更容易管理。
  • 每个文件夹 100 个随机文件听起来并不容易管理,因为如果没有某种外部索引机制,您将永远无法找到任何东西。但如果这就是你真正想要的,xargs 可能会有所帮助。
  • 我强烈建议您在开始大规模重命名之前备份原始文件。后悔自己所做的事情的风险太大。
  • 相关,由同一个提问者,但不同:stackoverflow.com/questions/26171286

标签: linux bash debian


【解决方案1】:

只需使用标准且更可控的命令即可更好地组织文件:

cd <your_image_folder_pathname>    
mkdir img_jpg img_gif img_bmp img_tiff

mv *.jpg img_jpg
mv *.gif img_gif
mv *.bmp img_bmp
mv *.tiff img_tiff

将剩余文件移动到 img_misc

mkdir img_misc
find -type f | xargs -I {} mv {} img_misc

【讨论】:

    【解决方案2】:

    如果你在 Linux 上,GNU mv 命令有一个方便的选项 -t target-directory 可以与 xargs 一起使用,但是这里我们需要每 100 个文件创建一个不同的目标目录,所以我们不会正在使用-t

    xargs 命令可以将文件名分组为 100 个一组。剩下的问题是确定目标的目录名。为此,一个 shell 脚本是合适的:

    #!/bin/bash
    
    mkdir -p images-000
    dirnum=$(ls -d images-[0-9][0-9][0-9] | sed -n '$s/images-//p')
    newdir="images-$(($dirnum + 1))"
    mv "$@" "$newdir"  # or: qmv -t "$newdir" "$@"
    rm -fr images-000
    

    images-000 目录是为初始化事物而创建的,但绝不是任何文件的目标。这次解析ls 是可以的,因为它列出的名称将不包含空格、换行符或其他尴尬字符。 (一般来说,解析ls的输出要格外小心。)

    使用名为 move-files.sh 的脚本,您现在可以运行以下内容:

    find /source/place-1 /opt/photos/place-2 … -type f -print0 |
    xargs -0 -n 100 -r -- movefiles.sh
    

    注意-print0-0 主要是findxargs 的GNU 扩展,但Mac OS X 的findxargs 也支持它们。 xargs-r 选项也是 GNU 扩展; Mac OS X xargs 不支持它,并且它没有等价物。也称为--no-run-if-empty;这意味着如果没有列出文件名,xargs 不会运行程序movefiles.sh,这与标准xargs 不同,即使没有文件名,也需要至少运行一次命令。如果您没有-r,您可以修改带有if [ $# != 0 ]; then …current script…; fi 的脚本,以便在使用零参数调用它时保护它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-05-27
      • 1970-01-01
      • 2014-06-06
      • 2013-04-14
      • 2023-04-07
      • 2021-02-28
      • 1970-01-01
      • 2016-06-13
      相关资源
      最近更新 更多