shell创建新目录并检查它是否存在

时间:2013-02-04 06:21:47

标签: bash shell

文件有很多行,每行包含

int folder-name file-path file-path file-path

例如

1001    AS35_59328      RICwdsRSYHSD11-2-IPAAPEK-93     /ifshk5/BC_IP/PROJECT/T1
1073/T11073_RICekkR/Fq/AS35_59328/111220_I631_FCC0E5EACXX_L4_RICwdsRSYHSD11-2-IP
AAPEK-93_1.fq.gz        /ifshk5/BC_IP/PROJECT/T11073/T11073_RICekkR/Fq/AS35_5932
8/111220_I631_FCC0E5EACXX_L4_RICwdsRSYHSD11-2-IPAAPEK-93_2.fq.gz  
/ifshk5/BC_IP/PROJECT/T11073/T11073_RICekkR/Fq/AS35_5932
8/111220_I631_FCC0E5EACXX_L4_RICwdsRSYHSD11-2-IPAAPEK-9322121_2.fq.gz  

所以我怎样才能获得文件夹名称(AS35_59328)并创建文件夹(如果没有创建)。

获取行第二部分AS35_59328,如果AS35_59328已经存在,将行中的所有文件放入文件夹,否则创建AS35_59328文件夹然后将文件放入

2 个答案:

答案 0 :(得分:0)

$ cat stack.txt 
1001    AS35_59328      RICwdsRSYHSD11-2-IPAAPEK-93     /ifshk5/BC_IP/PROJECT/T1
1073/T11073_RICekkR/Fq/AS35_59328/111220_I631_FCC0E5EACXX_L4_RICwdsRSYHSD11-2-IP
AAPEK-93_1.fq.gz        /ifshk5/BC_IP/PROJECT/T11073/T11073_RICekkR/Fq/AS35_5932
8/111220_I631_FCC0E5EACXX_L4_RICwdsRSYHSD11-2-IPAAPEK-93_2.fq.gz  
/ifshk5/BC_IP/PROJECT/T11073/T11073_RICekkR/Fq/AS35_5932
8/111220_I631_FCC0E5EACXX_L4_RICwdsRSYHSD11-2-IPAAPEK-9322121_2.fq.gz


$for j in $(for i in `cat stack.txt | tr '\n' '\0' | grep -a -o '/.*gz'`; do echo $i ;     done | awk -F\/ '{ print $NF }'); do echo $j ; done
111220_I631_FCC0E5EACXX_L4_RICwdsRSYHSD11-2-IPAAPEK-93_1.fq.gz
111220_I631_FCC0E5EACXX_L4_RICwdsRSYHSD11-2-IPAAPEK-93_2.fq.gz
111220_I631_FCC0E5EACXX_L4_RICwdsRSYHSD11-2-IPAAPEK-9322121_2.fq.g

最终oneliner:

这一个衬垫将帮助您获取所有文件名,然后它将所有这些提取的文件名复制到AS35_59328。如果AS35_59328不存在,它将创建这样一个目录,然后将所有这些文件放入其中。

if [ -d "AS35_59328"]; then for j in $(for i in `cat stack.txt | tr '\n' '\0' | grep -a -o '/.*gz'`; do echo $i ; done | awk -F\/ '{ print $NF }'); do cp -v $j AS35_59328/ ; done ; else for j in $(for i in `cat stack.txt | tr '\n' '\0' | grep -a -o '/.*gz'`; do echo $i ; done | awk -F\/ '{ print $NF }'); do mkdir AS35_59328 && cp -v $j AS35_59328/ ; fi

答案 1 :(得分:0)

另一种纯粹的shell解决方案:

while read line; do
  set $line
  key=$1; shift
  dir=$1; shift
  test -d $dir || mkdir $dir
  mv $@ $dir
done < myfile.txt

    bll-laptop:bll$ cat t.sh
    #!/bin/bash

    cat > myfile.txt << _HERE_
    1001 d1 a b c
    1002 d2 d e f
    1003 d3 g h i
    _HERE_

    touch a b c d e f g h i
    rm -rf d1 d2 d2 > /dev/null 2>&1
    mkdir d1

    while read line; do
      set $line
      key=$1; shift
      dir=$1; shift
      test -d $dir || mkdir $dir
      mv $@ $dir
    done < myfile.txt

    ls -R

    bll-laptop:bll$ ./t.sh
    .:
    d1  d2  d3  myfile.txt  t.sh

    ./d1:
    a  b  c

    ./d2:
    d  e  f

    ./d3:
    g  h  i
    bll-laptop:bll$