ファイル拡張子に基づいてファイルをソートし、ディレクトリに移動します。

ファイル拡張子に基づいてファイルをソートし、ディレクトリに移動します。

ファイルのさまざまな種類の拡張子を受け入れ、その拡張子からディレクトリを生成するスクリプトがあります。

ただし、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:lfはileの拡張であり、小文字eに変換されますl(したがって、両方にFILE.DOCX移動します)。file.docxdoc
  • ${var-default}標準/Bourne演算子で、設定がないdefault場合まで拡張されます(ここでは連想配列要素に適用されます)。$var

zshの組み込み関数はmvこのオプション(GNU拡張)をサポートしていませんが、ループの代わりに-v使用できます。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


関連情報