我有一个 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