如何按bash中的文件类型对文件进行分组

时间:2017-03-23 01:44:11

标签: bash

我收到了一堆没有相应扩展名的恢复文件。如何根据文件类型将它们分组到不同的目录中? (例如,一个目录中的pdf,另一个目录中的图像......)

我尝试了file * | grep -ie [myKeyword],但我不知道如何从输出中提取文件名并将其传递给mv。还研究了find,但据我所知,它只能区分目录,链接和文件,而不是特定的文件类型。

2 个答案:

答案 0 :(得分:2)

file可以通过管道传递到awk,只返回用于设置目录的文件类型:

for i in *; do
    dir=$(file "$i" | awk -F ': |, ' '{print $2}');
    if [[ "$i" != "directory" ]]; then
        mkdir -p "${dir%% *}"
        mv "$i" "${dir%% *}/$i"
    fi
done

基本思想是使用$dir管道传递给file的结果设置变量(awk),然后创建相应的目录并将文件移入其中。使用: |,等于分隔符为冒号+空格(:)或(|)逗号(,)+空格。

首先使用干运行

for i in *; do
    dir=$(file "$i" | awk -F ': |, ' '{print $2}')
    if [[ "$i" != "directory" ]]; then
        echo "${dir%% *}"
        echo "$i" "${dir%% *}/$i"
    fi
done

答案 1 :(得分:1)

关于类型分组想法的l'L'l帽子的提示 最后,这个答案只是their helpful answer的变体,虽然可能稍微有点效率。

以下命令将文件移动到以其类型 groups 命名的子目录中,其中类型组由完整类型描述的第一个, - 分隔标记组成(例如,类型组PDF document, version 1.5PDF document):

file * | while IFS=':' read -r file type; do 
 [[ -f $file && -r $file ]] || continue
 [[ $type =~ ^\ *([^,]+) ]] && typeGroup=${BASH_REMATCH[1]//\//-}
 mkdir -p "$typeGroup" && mv "$file" "$typeGroup/" 
done
  • 由于缺少权限而无法读取的文件会被忽略。

  • 此外,还有/个字符。在类型组名称中替换为-。 (例如,a /usr/bin/python script text executable变为a -usr-bin-python script text executable),但可能还有其他边缘情况需要处理。 再次感谢,l' L' l。