如果文件名减去扩展名匹配,则将一组文件移动到新文件夹?

时间:2013-12-16 19:18:30

标签: bash recursion match grouping filenames

我有一个文件夹,其中包含相同名称但文件扩展名不同的文件。例如:

file-1.ai
file-1.svg
file-1.pdf
file-2.ai
file-2.svg
file-2.txt
file-3.ai
file-3.svg
example-1.pdf
example-3.mov

Linux中是否有任何方法(任何编程语言都可以)我可以将文件组移动到新文件夹(每个文件组的新文件夹或一个文件夹中的所有文件夹),如果他们的文件名,减去扩展名,匹配?

3 个答案:

答案 0 :(得分:3)

认为你想要这样的东西。

#!/bin/bash

dir="/somedir/"
for i in "$dir"*; do
  if [ -f "$i" ]; then
    filename="${i%%.*}"
    if [ ! -d "$filename" ]; then
      mkdir "$filename"
    fi

    mv "$i" "$filename"
  fi

done

e.g。

$ tree /somedir
/somedir
├── example-1.pdf
├── example-3.mov
├── file-1.ai
├── file-1.pdf
├── file-1.svg
├── file-2.ai
├── file-2.svg
├── file-2.txt
├── file-3.ai
└── file-3.svg

$ ./above_script

$ tree /somedir
/somedir
├── example-1
│   └── example-1.pdf
├── example-3
│   └── example-3.mov
├── file-1
│   ├── file-1.ai
│   ├── file-1.pdf
│   └── file-1.svg
├── file-2
│   ├── file-2.ai
│   ├── file-2.svg
│   └── file-2.txt
└── file-3
    ├── file-3.ai
    └── file-3.svg 

答案 1 :(得分:1)

有很多方法可以做到这一点。一种解决方案是简单地使用move命令:

mv file-1.* /new/directory

这将移动名为file-1的所有文件,无论新目录的扩展名如何。

答案 2 :(得分:1)

考虑这个脚本:

for i in *.*; do
   d="${i%.*}"
   [[ ! -d "$d" ]] && mkdir "$d"
   cp "$i" "$d"
done
相关问题