假设我有一个无组织的目录,其中有数千个文件,其名称中包含前缀,如abc-tab,abc-vib,h12-123,h12-498 ....如何将具有相同前缀的文件移动到其中自己的目录?
我正在考虑使用像
这样的东西find . -path '*/support/*abc*' -exec mv "{}" /new/abc\;
但这意味着我必须为每个前缀重新键入命令。
答案 0 :(得分:4)
使用ls
和uniq
获取所有前缀以获取单个列表,然后使用for循环移动文件。
for F in $(ls | cut -d- -f1 | uniq); do
mkdir "${F}" && mv "${F}"-* "${F}"
done
许多人从Advanced Bash Scripting Guide学习shell脚本。有关这些程序的详细信息,请查看cut
和uniq
手册页。
答案 1 :(得分:1)
我会使用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会自动删除源文件,我希望确保在此之前发生正确的操作。
答案 2 :(得分:0)
如果命令基本上按照你的意愿执行,你可以简单地用它包围一个脚本:
for i in abc h12 something_else
do
find . -path \*/support/\*${i}\* -exec mv "{}" /new/${i} +
done
答案 3 :(得分:0)
像这样的脚本应该适合你:
while read l
do
prefix=${l%-*}
mv "$l" "/new/$prefix"
done < <(find '*/support/')