3

假设我有一个杂乱无章的目录,其中包含数千个名称中带有前缀的文件,例如 abc-tab、abc-vib、h12-123、h12-498.... 如何将具有相同前缀的文件移动到它们自己的目录中?

我正在考虑使用类似的东西

find . -path '*/support/*abc*' -exec mv "{}" /new/abc\;

但这意味着我必须为每个前缀重新键入命令。

4

4 回答 4

4

ls使用and获取所有前缀uniq以获取单个列表,然后使用 for 循环移动文件。

for F in $(ls | cut -d- -f1 | uniq); do
    mkdir "${F}" && mv "${F}"-* "${F}"
done

许多人从Advanced Bash Scripting Guide中学习 shell 脚本。查看这些程序的详细信息cutuniq手册页。

于 2013-05-09T20:15:52.483 回答
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 会自动删除源文件,我喜欢确保在此之前发生正确的操作。

于 2013-05-09T20:15:38.017 回答
0

如果该命令基本上可以执行您想要的操作,您可以简单地围绕它包装一个脚本:

for i in abc h12 something_else
do 
  find . -path \*/support/\*${i}\* -exec mv "{}" /new/${i} +
done
于 2013-05-09T20:14:47.230 回答
0

像这个脚本这样的东西应该适合你:

while read l
do
   prefix=${l%-*}
   mv "$l" "/new/$prefix"
done < <(find '*/support/')
于 2013-05-09T20:24:39.410 回答