我这里有一个小但有趣的任务。我有一个扩展名相同的文件列表,例如
a.abc
b.abc
c.abc
我想要的是首先为每个a
文件创建名为b
,c
,.abc
...的文件夹,然后将每个文件夹移动到其文件夹中
我能够使用cmd行find ... | sed ... | xargs mkdir...
非常简单地完成第一步,但是当我尝试使用类似的cmd将每个文件移动到自己的文件夹中时,我找不到答案。
我在这里不熟悉cmd,我有一个非常模糊的内存,在find
cmd我可以使用某种后向引用来重用文件/目录名,我记得它错了吗?搜索了一下,但找不到一个好的参考。
有人可以帮我在这里完成cmd吗?
感谢。
答案 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)
以下是使用空格处理文件名的find
和xargs
解决方案:
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