根据文件扩展名对文件进行排序并将它们移动到目录中

根据文件扩展名对文件进行排序并将它们移动到目录中

我有一个脚本,它接受文件中所有不同类型的扩展名并从中创建一个目录。

但是,我只需要为 3 种类型的扩展创建一个目录。 JPG/JPEG、DOC/DOCX 和 1 个具有其他类型扩展名“杂项”的目录。

这是到目前为止我的脚本。

#!/bin/bash
exts=$(ls | sed 's/^.*\.//' | sort -u)
for ext in $exts; do
  mkdir $ext
  mv -v *.$ext $ext/
done

答案1

zsh

#! /bin/zsh -
# speed things up by making mv builtin
zmodload zsh/files

# associative array giving the destination directory for each
# type of file
typeset -A dst=(
  doc  doc
  docx doc
  jpg  jpeg 
  jpeg jpeg
)

# default for files with extensions not covered by $dst above or
# files without extension
default=miscellaneous

mkdir -p $dst $default || exit

for f (*(N.)) mv -i -- $f ${dst[$f:e:l]-$default}/
  • *(N.)扩展到所有非隐藏常规的.当前目录中的files ( ) (使用Nullglob,因此如果没有此类文件,它会扩展为空列表)。
  • $f:e:lfile 的extension,转换为l小写(因此 和 都FILE.DOCX移动file.docxdoc.
  • ${var-default}是标准/Bourne 运算符,它扩展为defaultif $varis no set(此处应用于关联数组元素)。

zsh的内置函数mv不支持该-v选项(GNU 扩展),但您可以使用zmv.而不是循环:

autoload zmv
zmv -v '*(#qN.)' '${dst[$f:e:l]-$default}/$f'

答案2

你可以尝试这样的事情,在bash,与正则表达式二元运算符=~:

# create an array of "known" extensions
known_ext=(jpg jpeg doc docx)

# loop over the files
for f in *; do
  # if not a file keep looping
  [ ! -f "$f" ] && continue
  # if file has a known extension
  if [[ " ${known_ext[@]} " =~ " ${f##*.} " ]]; then
    # create the dir if not exists
    mkdir -p "${f##*.}" &&
    # and move the file to that dir
    mv -- "$f" "${f##*.}"
  else
    # else create dir miscellaneous if not exists
    mkdir -p miscellaneous &&
    # move the file
    mv -- "$f" miscellaneous
  fi
done

答案3

我会运行以下命令

mkdir miscellaneous doc jpg
find . -maxdepth 1 -type f \( -name "*.doc" -o -name "*.docx" \) -exec mv -v {} doc/ \;
find . -maxdepth 1 -type f \( -name "*.jpg" -o -name "*.jpeg" \) -exec mv -v {} jpg/ \;
find . -maxdepth 1 -type f -exec mv -v {} miscellaneous/ \;

您可以通过以下测试来检查它是否按您想要的方式工作:

touch foo.mp3 foo.mp4 foo.doc foo.docx foo.jpg foo.jpeg foo.png foo

运行上面的命令并检查tree文件的移动方式:

tree
.
├── doc
│   ├── foo.doc
│   └── foo.docx
├── jpg
│   ├── foo.jpeg
│   └── foo.jpg
└── miscellaneous
    ├── foo
    ├── foo.mp3
    ├── foo.mp4
    └── foo.png

3 directories, 8 files


相关内容