![根据文件类型将文件分类到文件夹中](https://linux22.com/image/89278/%E6%A0%B9%E6%8D%AE%E6%96%87%E4%BB%B6%E7%B1%BB%E5%9E%8B%E5%B0%86%E6%96%87%E4%BB%B6%E5%88%86%E7%B1%BB%E5%88%B0%E6%96%87%E4%BB%B6%E5%A4%B9%E4%B8%AD.png)
我已经恢复了大约 2.8TB(是的,太字节)的数据,这将被扫描以查找重复项,这些文件所在的机器相当旧,只有 2GB 内存(但是对于 LVM 来说工作正常),所以执行以下操作重复扫描它是在寻求痛苦。
我的问题是,如何让 Debian 将文件移动到具有该文件类型的文件夹中,在需要时自动重命名,而无需指定文件类型列表。
我有大约 800GB 的可用空间,所以我可以在让它在我的数据上运行之前做一些测试。
答案1
我将 Stephen 的代码封装在一个脚本中,并稍微改进了管道。
#!/bin/bash
set -e
set -u
set -o pipefail
start=$SECONDS
exts=$(ls -dp *.*| grep -v / | sed 's/^.*\.//' | sort -u) # not folders
ignore=""
while getopts ':f::i:h' flag; do
case "$flag" in
h)
echo "This script sorts files from the current dir into folders of the same file type. Specific file types can be specified using -f."
echo "flags:"
echo '-f (string file types to sort e.g. -f "pdf csv mp3")'
echo '-i (string file types to ignore e.g. -i "pdf")'
exit 1
;;
f)
exts=$OPTARG;;
i)
ignore=$OPTARG;;
:)
echo "Missing option argument for -$OPTARG" >&2;
exit 1;;
\?)
echo "Invalid option: -$OPTARG" >&2
exit 1
;;
esac
done
for ext in $exts
do
if [[ " ${ignore} " == *" ${ext} "* ]]; then
echo "Skiping ${ext}"
continue
fi
echo Processing "$ext"
mkdir -p "$ext"
mv -vn *."$ext" "$ext"/
done
duration=$(( SECONDS - start ))
echo "--- Completed in $duration seconds ---"
答案2
目录看起来像
$ ls
another.doc file.txt file1.mp3 myfile.txt
我们可以使用以下命令构建文件扩展名列表:
$ exts=$(ls | sed 's/^.*\.//' | sort -u)
然后我们可以循环遍历这些扩展名,将文件移动到子目录中:
$ for ext in $exts
> do
> echo Processing $ext
> mkdir $ext
> mv -v *.$ext $ext/
> done
运行时我们得到以下输出:
Processing doc
'another.doc' -> 'doc/another.doc'
Processing mp3
'file1.mp3' -> 'mp3/file1.mp3'
Processing txt
'file.txt' -> 'txt/file.txt'
'myfile.txt' -> 'txt/myfile.txt'
结果:
$ ls
doc/ mp3/ txt/
$ ls *
doc:
another.doc
mp3:
file1.mp3
txt:
file.txt myfile.txt