【问题标题】:How to sort files into folders by filetype on bash (with 'file' command)?如何在 bash 上按文件类型将文件排序到文件夹中(使用“文件”命令)?
【发布时间】:2011-04-23 13:21:33
【问题描述】:

恢复后我有数千个没有扩展名的文件(主要是图片)。我需要按文件类型将它们分类到单独的文件夹中(文件夹必须在分类过程中创建)。我可以使用“文件”命令确定 linux 中的文件类型。有人有 bash 脚本吗?

例如:初始目录包含文件:001、002、003、004。排序后应该是3个目录: 'jpeg' 包含 001.jpg、003.jpg; 'tiff' 包含 002.tiff 和 'others' 包含 004。

【问题讨论】:

    标签: linux bash file file-type


    【解决方案1】:

    爸爸的答案调整:

    #!/bin/bash
    
    file --mime-type -F"&" [YOUR PATH]/* > filetypes.txt
    mkdir -p `cut -f2 -d"&" filetypes.txt | sed 's/[ ,:]//g' | sort -u`
    IFS=$'\n'
    for x in `cut -f1 -d"&" filetypes.txt`
    do
      mv "$x" `file -b --mime-type "$x" | sed 's/[ ,:]//g'`
    done 
    

    【讨论】:

      【解决方案2】:

      我用这个,它对我有用:

      #!/bin/bash
      
      self_name=`basename "$0"`
      for f in *
      do
          if [  -f "$f" ] && [ "$f" !=  "$self_name" ]; then
              filename="${f%.*}"
              ext="${f##*.}"
              mkdir $ext
      
              mv "$f" "$ext/$f"
      
              htmlfiles="{$f}_files"
              if [ -d "$htmlfiles" ];then
                  mv "$htmlfiles" "$ext/$htmlfiles"
              fi
      
              if [ $? -ne 0 ]
                  then
                  echo "Error: Failed mv $f"
              fi
          fi
      
          if [  -d "$f" ];then
              mv "$f" "$ext/$f"
          fi
      done
      

      你应该把它放在你的目录中并运行它,它会为扩展创建一个子目录

      【讨论】:

        【解决方案3】:

        这个答案不会对每个文件多次执行file命令,这是不必要的

        file  -N --mime-type -F"-&-" * | awk -F"-&-" 'BEGIN{q="\047"}
        {
          o=$1
          gsub("/","_",$2);sub("^ +","",$2)
          if (!($2  in dir )) {
            dir[$2]
            cmd="mkdir -p "$2
            print cmd
            #system(cmd) #uncomment to use
          }
          files[o]=$2
        }
        END{
         for(f in files){
            cmd="cp "q f q"  "q files[f]"/"f".jpg" q
            print cmd
            #system(cmd) #uncomment to use
         }
        }'
        

        类似地,可以通过使用关联数组的 ba​​sh4+ 脚本来完成。

        【讨论】:

          【解决方案4】:

          这样的事情怎么样:

          
          mkdir -p `file -b --mime-type *|uniq`
          for x in `ls`
          do
                  cp $x `file -b --mime-type $x`
          done
          

          我使用 cp,它不能与目录一起使用。

          【讨论】:

          • 你说得对,谢谢,但有一些不足(见调整)。
          • 你可以使用for x in *
          猜你喜欢
          • 2015-02-13
          • 1970-01-01
          • 2013-12-07
          • 2011-12-30
          • 1970-01-01
          • 1970-01-01
          • 2011-08-23
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多