将文件移动到子目录:/img/ab123.jpg --> /img/ab/ab123.jpg

将文件移动到子目录:/img/ab123.jpg --> /img/ab/ab123.jpg

我有一个 Linux Web 服务器,其中一个目录中有大约 25,000 张图片。它们都是小写,格式为两个字母、三个数字,扩展名为 jpg。由于一个文件夹中有这么多文件难以管理,因此我想根据文件名的前两个字母将它们移动到子文件夹中,如下所示:

/images/ab123.jpg --> /images/ab/ab123.jpg
/images/ab383.jpg --> /images/ab/ab383.jpg
/images/sk234.jpg --> /images/sk/sk234.jpg

我已经成功列出了大约 250 种不同的字母组合并创建了子目录:

ls | awk '{print substr($0,0,2)}' | uniq | xargs mkdir

但我无法移动文件。有什么想法吗?

答案1

Bash 可以为您完成子字符串提取。

以下一行代码假定目标目录已经存在:

cd /images; for f in *.jpg; do mv "$f" "${f:0:2}"; done

这个小脚本为您创建目录并执行移动。

cd /images &&
for f in *.jpg
do
    pre=${f:0:2}
    if [[ ! -d $pre ]]
    then
        mkdir "$pre"
    fi
    mv "$f" "$pre"
done

答案2

尝试一下

for i in $(find . -type f -maxdepth 1); do mv $i $(echo $i|awk '{print substr($0,0,2)}');done

答案3

很多文件,所以我们要避免使用通配符,而使用 find(1):我使用 Zsh 作为 shell:文件名包含双引号时仍然存在问题

find  -maxdepth 1  -type f -exec zsh -c 'a="{}";b=${a:0:4}; mkdir -p $b; mv -t $b $a'   \;

答案4

我相信最简单的方法是使用rename使用适当的正则表达式的命令:

rename 's/^([a-zA-Z]{2})/$1\/$&/' *.jpg

描述:

$& - its original filename,

$1 - matched 2 first letters, used here as directory name

相关内容