Linux:如何将每个文件移动到相应命名的文件夹中

时间:2012-08-14 22:22:14

标签: linux shell

我这里有一个小但有趣的任务。我有一个扩展名相同的文件列表,例如

a.abc
b.abc
c.abc

我想要的是首先为每个a文件创建名为bc.abc ...的文件夹,然后将每个文件夹移动到其文件夹中

我能够使用cmd行find ... | sed ... | xargs mkdir...非常简单地完成第一步,但是当我尝试使用类似的cmd将每个文件移动到自己的文件夹中时,我找不到答案。

我在这里不熟悉cmd,我有一个非常模糊的内存,在find cmd我可以使用某种后向引用来重用文件/目录名,我记得它错了吗?搜索了一下,但找不到一个好的参考。

有人可以帮我在这里完成cmd吗?

感谢。

3 个答案:

答案 0 :(得分:15)

这是你的一个班轮

find . -name "*.abc" -exec sh -c 'NEWDIR=`basename "$1" .abc` ; mkdir "$NEWDIR" ; mv "$1" "$NEWDIR" ' _ {} \;

或者

find . -name "*.abc" -exec sh -c 'mkdir "${1%.*}" ; mv "$1" "${1%.*}" ' _ {} \;

this是使用find而不是手册页的更好指南。

This页面解释了正在进行的参数扩展(了解${1%.*}

答案 1 :(得分:5)

以下是使用空格处理文件名的findxargs解决方案:

find . -type f -print0 | xargs -0 -l sh -c 'mkdir "${1%.*}" && mv "$1" "${1%.*}"' sh

请注意,它不支持带换行符和/或shell可扩展字符的文件名。

答案 2 :(得分:2)

for F in /tmp/folder/*.abc # replace by $1 for first arg
do
   BASE="${F%.abc}"
   mv "$F" "$BASE"
done