根據文件類型將文件分類到資料夾中

根據文件類型將文件分類到資料夾中

我已經恢復了大約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

相關內容