移动,将平面文件系统重命名为基于文件名的目录

时间:2015-01-16 09:58:27

标签: linux bash sharding

我在拥有16000多个movs的centos系统上安装了一个sun目录,由于文件数量的原因,在那里写入它们的应用程序现在很难读取目录。

每个文件名都是唯一的,并且如果它没有短划线( - )则由短划线( - )分隔,它保留在根目录中。 例如。

文件名02342.mov,1-9593-0002-001.mov,1-9593-0002-002.mov,2-3690-0005-001.mov,Y-0757-0245.mov和ROB-01- 002-Y.mov应该这样结束,以便客户端的网络流应用程序可以将其作为原始文件名进行流式传输(他们的网络团队将处理该部分)。

mnt
|-- media
      |-- 02342.mov
      |-- 1
      |   |-- 9593
      |   |-- 0002
      |         |-- 001.mov
      |         |-- 002.mov
      |-- 2
      |   |-- 3690
      |         |-- 0005
      |               |-- 001.mov
      |-- ROB
      |   |-- 01
      |         |-- 002
      |               |-- Y.mov
      |-- Y
          |-- 0757
                |-- 0245.mov

然而,它将最后一部分创建为目录,例如/mnt/media/1/9593/0002/001.mov /

到目前为止,我的被盗脚本。

    #!/bin/sh

    for i in $(/bin/ls *-* | xargs)
    do
        dir=$(echo $i | cut -f1 -d '-')
        mkdir -p $dir
        dir1=$(echo $i | cut -f2 -d '-')
        mkdir -p $dir/$dir1
        dir2=$(echo $i | cut -f3 -d '-')
        mkdir -p $dir/$dir1/$dir2
        dir3=$(echo $i | cut -f4 -d '-') #here is where I get lost
        mkdir -p $dir/$dir1/$dir2/$dir3
        #dir4=$(echo $i | cut -f5 -d '-')
        #mkdir -p $dir/$dir1/$dir2/$dir3/$dir4
        echo $dir3
        #mv $i $dir3 # This doesnt work.

    done

我很确定只是做dir1,dir2等等是错误的做法,但我的知识在这一点上是有限的。

最后一部分我将在之后做一个简单的正则表达式重命名,但还没有那么远。

d

2 个答案:

答案 0 :(得分:0)

我首先提供伪算法。

  1. 使用find
  2. 查找所有mov文件 每个文件名
  3. 2.1使用bash替换修剪文件名路径及其结尾

     like `${filename##*/}` and `${filename%-*\.mov}`
    

    2.2使用bash的替换内置替换所有破折号

     like `${filename//-/\/}`
    

    2.3 mkdir -p ${filename//-/\/}

    2.4如果需要,移动文件

  4. 希望这有助于构建脚本。

答案 1 :(得分:0)

无需致电lsxargscut。 Bash可以通过路径扩展和参数扩展来处理它。

for mov in *-*.mov ; do
    path=${mov//-//}               # Replace all "-" with "/"
    path=${path%/*}                # Remove from the last "/"
    mkdir -p "$path"
    name=${mov##*-}                # Remove up to the last "-"
    mv "$mov" "$path/$name"
done

glob可能需要很长时间甚至失败。使用可以逐个读取文件而不将其全部列出的工具可能会更好。请参阅Perl to the rescue: case study of deleting a large directory