我有这样的目录结构
file 1.ext1
file 1.ext2
file 1.ext3
file 2.temp.ext1
file 2.ext2
file 3.ext1
我想创建每个子文件夹并移动每个文件名,无论其扩展名是什么
file 1\file 1.ext1
file 1\file 1.ext2
file 1\file 1.ext3
file 2\file 2.temp.ext1
file 2\file 2.ext2
file 3\file 3.ext1
有什么简单的方法吗?谢谢
答案1
find . -type f -exec sh -c 'base=$(echo $1 | grep -oP "(?<=\./).*(?=\.[^\.]*$)"); mkdir -p "${base}"; mv "$1" "$base"' . {} \;
解释
find . -type f
该脚本将对所有“常规”文件进行操作(即,不会对当前目录起作用.
)。-exec sh -c '...' . {} \;
执行'...
' 部分,将文件名作为参数提供给脚本(并由 访问$1
)。base=$(echo $1 | grep -oP "(?<=\./).*(?=\.[^\.]*$)");
导出文件名的基本部分。即最后grep
的之后和之前的部分。./
.
mkdir -p "${base}";
创建目录(例如file1
)。mv "$1" "$base"
将文件移动到新创建的目录中。
如果您希望将诸如的文件file1.temp.ext1
移动到目录file1
,而不是file1.temp
,那么您可以改用以下命令。
find . -type f -exec sh -c 'base=$(echo $1 | grep -oP "(?<=\./)[^\.]*(?=\..*$)"); mkdir -p "${base}"; mv "$1" "$base"' . {} \;
解释
(?<=\./)[^\.]*(?=\..*$)
唯一不同的部分是用于捕获文件名“基本”部分的正则表达式,新目录将在此创建。现在,它将捕获到第一个.
,而不是最后一个.
。
答案2
这就足够了:
#!/bin/bash
#this script sorts files according to their extensions
oldIFS=$IFS
IFS=$'\n'
(find . -type f) > /tmp/temp
for var in `cat /tmp/temp`
do
name=`basename "$var"`
name=`echo $name | cut -d'.' -f1`
mkdir -p $name
mv "$var" $name/ 2> /dev/null
done
IFS=$oldIFS