我有一个脚本,它接受文件中所有不同类型的扩展名并从中创建一个目录。
但是,我只需要为 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 ( ) (使用N
ullglob,因此如果没有此类文件,它会扩展为空列表)。$f:e:l
是f
ile 的e
xtension,转换为l
小写(因此 和 都FILE.DOCX
移动file.docx
到doc
.${var-default}
是标准/Bourne 运算符,它扩展为default
if$var
is 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