[英]BASH one-line alphabetical mass file sort using for, mv, and grep
我有成千上万个文件,格式为"^[[:digit:]]\\{4\\} - [[:alpha:]].*"
::: "^[[:digit:]]\\{4\\} - [[:alpha:]].*"
,例如:7958-a3ykof zyimeo3.txt。 我试图将它们简单地从连字符后的第一个字母字符按字母顺序移动到文件夹中。
我觉得我已经很接近要按照我想要的方式来实现它了,但是有一个(希望很简单)的问题。
我先用echo测试了该命令,以确保它可以获取正确的信息。 然后我尝试用mv真正执行它。 基于此文件列表,我在下面提供了一些示例:
1439 - a74389 josifj3oj.txt
3589 - Bfoei 839982 3il.txt
4719 - an38n8f n839mm20 mi02.txt
6398 - b39ji oij3o8 j2o.txt
9287 - A2984 j289jj9 oiw.txt
.... several thousand more files
这列出了所有以字母“ a”开头的文件(在开头的4位数字-空格-连字符-空格模式之后):
for i in "$(ls | grep -i "^[[:digit:]]\{4\} - a")"; do echo "$i"; done
这不会将所有以字母“ a”开头(在4位数字-连字符-空格模式之后)的文件放入“ A”文件夹中:
for i in "$(ls | grep -i "^[[:digit:]]\{4\} - a")"; do mv "$i" A; done
我期望第二个命令将每个名为“ ####-a *”或“ ####-A *”的文件移动到名为A的文件夹中。但是它将其视为一个由“ \\ n”连接的大字符串/文件名”。
这是示例错误消息:
mv: cannot stat '1439 - a74389 josifj3oj.txt\n9287 - A2984 j289jj9 oiw.txt\n2719 - an38n8f n839mm20 mi02.txt': No such file or directory
有人知道我在想什么吗?
在@alvits的答案与@chepner和@courtlandj的评论之间,对我而言完美无缺的是:
for directory in {A..Z}; do
mkdir -p "$directory" &&
find . -iregex "./[0-9]* - ${directory}.*" -exec mv -t "$directory" {} +;
done
这是最简单的方法。
for directory in {A..Z}; do
mkdir "$directory" &&
find . -iregex "./[0-9]* - ${directory}.*" -exec mv "{}" "$directory" \;
done
for
循环将根据文件名所属的每个目录查询文件名。
find
命令将查找文件并将其移动到目录。
BASH内置了类似RE的glob和序列创建功能。 您可以像这样使用它:
for i in {{A..Z},{a..z}}; do
mkdir "${i}" && mv [0-9][0-9][0-9][0-9]" - ${i}"*" "${i}"
done
您会注意到数字的四个重复,是的,看起来比[0-9]{4}
类的常规RE更加笨拙。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.