2013-05-09 141 views
2

说我有一个无组织的目录中有数以千计的文件,其名称中有前缀,如abc-tab,abc-vib,h12-123,h12-498 ....如何将具有相同前缀的文件移动到他们自己的目录中?Linux找到具有相似名称的文件,并移动到新目录

我想使用类似

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

但这意味着我将不得不重新键入该命令对每个前缀。

回答

4

抓住所有前缀lsuniq以获得单个列表,然后使用for循环移动文件。

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

很多人从Advanced Bash Scripting Guide学习shell脚本。查看cutuniq手册页,了解有关这些程序的详细信息。

+0

如果我想搬到新创建的文件夹,驱动器Z这将是这样的: 适用于F在$(LS |切-D- - f1 | uniq);做 mkdir“$ {F}”&& mv“$ {F}” - *“$ {/ z/F}” done – user2189312 2013-05-09 21:10:25

+0

您使用的是cygwin吗?然后你将第二行改为'mkdir/cygdrive/z /“$ {F}”&& mv“$ {F}” - */cygdrive/z /“$ {F}”'。 – andrewdotn 2013-05-09 21:16:09

+0

我正在使用gnome – user2189312 2013-05-09 21:31:54

0

如果命令基本上没有你想你可以简单地环绕它的脚本是什么:

for i in abc h12 something_else 
do 
    find . -path \*/support/\*${i}\* -exec mv "{}" /new/${i} + 
done 
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会自动删除源文件,并且我喜欢确保c在此之前发生的直接行为。

0

事情是这样的脚本应该为你工作:

while read l 
do 
    prefix=${l%-*} 
    mv "$l" "/new/$prefix" 
done < <(find '*/support/') 
相关问题