2015-10-22 46 views
0

我可能在我的脑海里。我正在尝试创建一个bash脚本,用于识别以5位数字开头的文件,检查该匹配文件(或文件组)是否存在目录并将文件移动到目录中。如果该目录不存在,我想创建它,然后移动这些文件。比较数组和创建目录

这是我到目前为止的剧本,但实际上它并不遥远。

476B Oct 19 14:43 . 
544B Oct 21 10:36 .. 
68B Sep 17 08:14 12345/ 
68B Sep 17 08:14 12735/ 
    0B Sep 17 08:14 29375.pdf 
    0B Sep 17 08:14 29375a.pdf 
    0B Sep 17 08:14 29375-1.pdf 
    0B Sep 17 08:14 32952.pdf 
    0B Sep 17 08:14 39472.pdf 
68B Sep 17 08:14 59723/ 
    0B Sep 17 08:14 97132.pdf 
273B Oct 19 14:43 sort.sh  

所以打算关闭这个例子,我想找出开头的文件29375,并建立一个目录,对他们来说:一个目录,需要进行排序应该是这样的

#!/bin/bash 

files=($(find . -type f | grep -E "[0-9]{5}" -o)) 
directories=($(find . -type d)) 

for i in ${files[*]} 
do 
    printf "▸ ▸ pdf file found: %s\n" $i 
done 

for d in ${directories[*]} 
do 
printf "▸ ▸ directory found: %s\n" $d 
done 

NewDir=(`echo ${files[@]} ${directories[@]} | tr ' ' '\n' | sort | uniq -u `) 

for nd in ${NewDir[*]} 
do 
    printf "mkdir for: %s\n" $nd 
done 

例,然后将它们移动到该目录中。

这是我遇到麻烦的地方,比较找到的文件和存在的目录。 NewDir数组是我在尝试搜索此解决方案时进行的一项测试。

感谢提供反馈/帮助。

回答

1

如果我正确理解你的问题,这样做的工作,而无需使用数组:

for dir in $(find -E . -type f -regex ".*/[[:digit:]]{5}.*" \ 
       | sed -E '[email protected]\./([0-9]{5}).*@\[email protected]' | sort -u) ; do 
    if [ ! -d "$dir" ] ; then 
     mkdir "$dir" 
    fi 
    if [ ! -d "$dir" ] ; then 
     continue 
    fi 
    find -E . -type f -regex ".*/$dir.*" -exec mv \{\} $dir \; 
done 

根据目录的数量,则可能需要将其转换为使用while循环消费输出为find -E . -type f -regex ".*/[[:digit:]]{5}.*" | sed -E '[email protected]\./([0-9]{5}).*@\[email protected]' | sort -u,如同目前的形式,后者可能会超过可接受的长度。

编辑:请注意,-regex实际上是一个GNU查找扩展,所以当GNU的发现是在PATH

+0

谢谢你找到的第一个find它只会工作。试图找出sed在做什么,但除此之外,脚本做的事情很奇怪。单独测试find命令会产生正确的结果。但是,当if语句检查$ dir时,它会使用整个文件名(带扩展名),而不是find命令的结果。添加一些printf进行调试,发生这种情况: 找到文件:./11111-1.jpg 检查目录是否存在... 找不到目录。制作:.11111-1.jpg mkdir:./11111-1.jpg:文件存在 目录是否存在?....是。 so..if [! -d $ dir]正在寻找目录? – Martin

+0

管道中的'sed'命令完全可以避免这种情况。你确定你没有错过任何东西吗?它的功能是(每个输入行):捕获5个数字后面的'。/'并输出该捕获。 –