我收到了一堆没有相应扩展名的恢复文件。如何根据文件类型将它们分组到不同的目录中? (例如,一个目录中的pdf,另一个目录中的图像......)
我尝试了file * | grep -ie [myKeyword]
,但我不知道如何从输出中提取文件名并将其传递给mv
。还研究了find
,但据我所知,它只能区分目录,链接和文件,而不是特定的文件类型。
答案 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.5
为PDF 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。