Как отсортировать файлы по папкам по типу файла на bash (командой file)? - PullRequest
6 голосов
/ 11 октября 2010

У меня после восстановления тысячи файлов без расширений (в основном картинки). Мне нужно отсортировать их в отдельные папки по типу файла (папки должны быть созданы в процессе сортировки). Я могу определить тип файла в Linux с помощью команды «файл». У кого-нибудь есть bash-скрипт для этого?

Например: Исходный каталог содержит файлы: 001, 002, 003, 004. После сортировки должно быть 3 каталога: 'jpeg' содержит 001.jpg, 003.jpg; «tiff» содержит 002.tiff, а «другие» содержат 004.

Ответы [ 4 ]

3 голосов
/ 11 октября 2010

корректировка ответа Дадама:

#!/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 
3 голосов
/ 11 октября 2010

Этот ответ не выполняет команду 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
 }
}'

аналогично, это можно сделать с помощью скрипта bash4 + с использованием ассоциативных массивов.

3 голосов
/ 11 октября 2010

Примерно так:


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

Я использую cp, он не может работать с каталогами.

2 голосов
/ 28 декабря 2015

Я использую это, и оно работает для меня:

#!/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

Вы должны поместить его в свой каталог и запустить его, и он сделает подкаталог для расширения

...