gpt4 book ai didi

Linux:更新基于前缀的文件夹中已有的数百万张图像的目录结构

转载 作者:太空宇宙 更新时间:2023-11-04 05:43:12 24 4
gpt4 key购买 nike

这基本上是 Linux: Move 1 million files into prefix-based created Folders 的后续内容。

原问题:

I want to write a shell command to rename all of those images into the following format:

original: filename.jpg new: /f/i/l/filename.jpg

现在,我想获取所有这些文件并向目录结构添加一个附加级别,例如:

original: /f/i/l/filename.jpg new: /f/i/l/e/filename.jpg

这可以通过命令行或 bash 来完成吗?

最佳答案

一种方法是简单地循环遍历您已有的所有目录,并在每个底层子目录中创建新的子目录并移动文件:

for d in ?/?/?/; do (
cd "$d" &&
printf '%.4s\0' * | uniq -z |
xargs -0 bash -c 'for prefix do
s=${prefix:3:1}
mkdir -p "$s" && mv "$prefix"* "$s"
done' _
) done

这可能需要一些解释。

glob ?/?/?/ 匹配由三个单字符子目录组成的所有目录路径。因为它以 / 结尾,所以它匹配的所有内容都是一个目录,因此不需要测试。

( cd "$d" && ...; )

在 cd 到相应的子目录后执行 ...。将该 block 放入 ( ) 中会导致它在子 shell 中执行,这意味着 cd 的范围将限制在括号内的 block 内。这比将 cd .. 放在末尾更容易、更安全。

然后我们首先通过查找文件的唯一初始字符串来收集子目录:

printf '%.4s\0' * | uniq -z | xargs -0 ...

提取每个文件名的前四个字母,每个字母以 nul 结尾,然后将此列表传递给 uniq 以消除重复项,并提供 -z 选项,因为输入以 nul 结尾,然后将唯一前缀列表传递给 xargs,再次使用 -0 指示该列表以 nul 结尾。 xargs 执行带有参数列表的命令,仅在必要时多次发出该命令以避免超出命令行限制。 (我们可能可以避免使用xargs,但它的成本并不高,而且更安全。)

用 xargs 调用的命令是 bash 本身;我们使用 -c 选项向其传递要执行的命令。该命令使用 for arg in 语法迭代其参数。每个参数都是一个唯一的前缀;我们从前缀中提取第四个字符来构建新的子目录,然后将名称以该前缀开头的所有文件mv到新创建的目录中。

xargs 调用末尾的 _ 将被传递给 bash(与所有其余参数一样); bash -c 使用命令后面的第一个参数作为脚本的 $0 参数,该参数不是 for arg in 语法迭代的命令行参数的一部分。因此,将 _ 放在那里意味着在执行 bash 命令时,由 xargs 构造的参数列表将恰好是 $1$2、...。

关于Linux:更新基于前缀的文件夹中已有的数百万张图像的目录结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38677031/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com