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

Der*_*rek 5 linux shell

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

a.abc
b.abc
c.abc
Run Code Online (Sandbox Code Playgroud)

我想在这里是先创建文件夹叫a,b,c...每一个.abc文件,然后将每一个到它的文件夹中.

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

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

谁能帮助我在这里完成cmd?

谢谢.

twm*_*wmb 15

这是你的一个班轮

find . -name "*.abc" -exec sh -c 'NEWDIR=`basename "$1" .abc` ; mkdir "$NEWDIR" ; mv "$1" "$NEWDIR" ' _ {} \;
Run Code Online (Sandbox Code Playgroud)

或者

find . -name "*.abc" -exec sh -c 'mkdir "${1%.*}" ; mv "$1" "${1%.*}" ' _ {} \;
Run Code Online (Sandbox Code Playgroud)

是在用更好的指导find比手册页.

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

  • 刚刚为我保存了 12,000 个文件夹创建!谢谢。 (3认同)

Tho*_*hor 5

这是一个findxargs它处理文件名带有空格的解决方案:

find . -type f -print0 | xargs -0 -l sh -c 'mkdir "${1%.*}" && mv "$1" "${1%.*}"' sh
Run Code Online (Sandbox Code Playgroud)

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