说我有一个无组织的目录中有数以千计的文件,其名称中有前缀,如abc-tab,abc-vib,h12-123,h12-498 ....如何将具有相同前缀的文件移动到他们自己的目录中?Linux找到具有相似名称的文件,并移动到新目录
我想使用类似
find . -path '*/support/*abc*' -exec mv "{}" /new/abc\;
但这意味着我将不得不重新键入该命令对每个前缀。
说我有一个无组织的目录中有数以千计的文件,其名称中有前缀,如abc-tab,abc-vib,h12-123,h12-498 ....如何将具有相同前缀的文件移动到他们自己的目录中?Linux找到具有相似名称的文件,并移动到新目录
我想使用类似
find . -path '*/support/*abc*' -exec mv "{}" /new/abc\;
但这意味着我将不得不重新键入该命令对每个前缀。
抓住所有前缀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
手册页,了解有关这些程序的详细信息。
如果命令基本上没有你想你可以简单地环绕它的脚本是什么:
for i in abc h12 something_else
do
find . -path \*/support/\*${i}\* -exec mv "{}" /new/${i} +
done
我会使用一个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在此之前发生的直接行为。
事情是这样的脚本应该为你工作:
while read l
do
prefix=${l%-*}
mv "$l" "/new/$prefix"
done < <(find '*/support/')
如果我想搬到新创建的文件夹,驱动器Z这将是这样的: 适用于F在$(LS |切-D- - f1 | uniq);做 mkdir“$ {F}”&& mv“$ {F}” - *“$ {/ z/F}” done – user2189312 2013-05-09 21:10:25
您使用的是cygwin吗?然后你将第二行改为'mkdir/cygdrive/z /“$ {F}”&& mv“$ {F}” - */cygdrive/z /“$ {F}”'。 – andrewdotn 2013-05-09 21:16:09
我正在使用gnome – user2189312 2013-05-09 21:31:54