将每个文件名移动到文件名子文件夹中

将每个文件名移动到文件名子文件夹中

我有这样的目录结构

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

相关内容