我在拥有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
答案 0 :(得分:0)
我首先提供伪算法。
find
2.1使用bash替换修剪文件名路径及其结尾
like `${filename##*/}` and `${filename%-*\.mov}`
2.2使用bash的替换内置替换所有破折号
like `${filename//-/\/}`
2.3 mkdir -p ${filename//-/\/}
2.4如果需要,移动文件
希望这有助于构建脚本。
答案 1 :(得分:0)
无需致电ls
,xargs
或cut
。 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。