假设我有一个杂乱无章的目录,其中包含数千个名称中带有前缀的文件,例如 abc-tab、abc-vib、h12-123、h12-498.... 如何将具有相同前缀的文件移动到它们自己的目录中?
我正在考虑使用类似的东西
find . -path '*/support/*abc*' -exec mv "{}" /new/abc\;
但这意味着我必须为每个前缀重新键入命令。
ls
使用and获取所有前缀uniq
以获取单个列表,然后使用 for 循环移动文件。
for F in $(ls | cut -d- -f1 | uniq); do
mkdir "${F}" && mv "${F}"-* "${F}"
done
许多人从Advanced Bash Scripting Guide中学习 shell 脚本。查看这些程序的详细信息cut
和uniq
手册页。
我会使用for
循环对每个文件名的每个实例进行操作。
从包含文件的目录中:
mkdir newfolder
for i in prefix_*
do
cp $i newfolder/$i
done
然后我会检查是否复制了正确的文件,如果是,请运行
rm prefix_*
更危险的方法是运行
mkdir newfolder
for i in prefix_*
do
mv $i newfolder/$i
done
但是 mv 会自动删除源文件,我喜欢确保在此之前发生正确的操作。
如果该命令基本上可以执行您想要的操作,您可以简单地围绕它包装一个脚本:
for i in abc h12 something_else
do
find . -path \*/support/\*${i}\* -exec mv "{}" /new/${i} +
done
像这个脚本这样的东西应该适合你:
while read l
do
prefix=${l%-*}
mv "$l" "/new/$prefix"
done < <(find '*/support/')