9

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

a.abc
b.abc
c.abc

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

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

我对这里的 cmd 不熟悉,而且我的记忆很模糊,在findcmd 中我可以使用某种反向引用来重用文件/目录名称,是我记错了吗?搜索了它,但找不到很好的参考。

谁能帮我在这里完成cmd?

谢谢。

4

3 回答 3

23

这是你的一个班轮

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%.*}" ' _ {} \;

这是一个比手册页更好的使用指南find

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

于 2012-08-14T23:16:15.430 回答
5

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

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

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

于 2012-08-14T23:41:00.890 回答
2
for F in /tmp/folder/*.abc # replace by $1 for first arg
do
   BASE="${F%.abc}"
   mv "$F" "$BASE"
done
于 2012-08-14T22:26:48.810 回答