递归移动和重命名文件

递归移动和重命名文件

我有以下文件结构:

root
root/year
root/year/MM-Month
root/year/MM-Month/YYMMTT_Event
root/year/MM-Month/YYMMTT_Event/01 Photos/
root/year/MM-Month/YYMMTT_Event/01 Screenshots/
root/year/MM-Month/YYMMTT_Event/02 Video/
root/year/MM-Month/YYMMTT_Event/Template.txt
root/year/MM-Month/YYMMTT_Event/File.xy2z.jpg
root/year/MM-Month/YYMMTT_Event/File.xy3z.jpeg
root/year/MM-Month/YYMMTT_Event/File.xy3z.nef
root/year/MM-Month/YYMMTT_Event/File.xy2z.raw
root/year/MM-Month/YYMMTT_Event/File.xyz2.png
root/year/MM-Month/YYMMTT_Event/File.xyz2.mov
root/year/MM-Month/YYMMTT_Event/File.xyz2.mpeg
  1. 我想将所有 Template.txt 文件重命名为YYMMTT_Event.txt递归。
  2. 我想将所有照片jpg, jpeg, nef, raw ...移至01 Photos folder: 。
  3. 我想将所有截图png, gif移至01 Screenshots文件夹。
  4. 我想将所有视频移动mov, mpeg02 Video文件夹。

做到这一点最简单的方法是什么?

提前致谢!

答案1

你可以尝试一下。

#!/usr/bin/env bash

shopt -s extglob nullglob

while IFS= read -r -d '' file ; do
  if [[ $file == *Template.txt && -f $file ]]; then
    temp="${file%/*}"
    echo mv -v "$file" "${file%/*}/${temp##*/}.txt"
  elif [[ $file == *Photos* && -d $file ]]; then
    Photordir=$file
  elif [[ $file == *Screenshots* && -d $file ]]; then
    Screendir=$file
  elif [[ $file == *Video* && -d $file ]]; then
    Videodir=$file
  elif [[ $file == *.@(jpg|jpeg|nef|raw) && -f $file ]]; then
    echo mv -v "$file" "$Photordir"
  elif [[ $file == *.@(png|gif) && -f $file ]]; then
    echo mv -v "$file" "$Screendir"
  elif [[ $file == *.@(mov|mpeg) && -f $file ]]; then
    echo mv -v "$file" "$Videodir"
  fi
done < <(find . -print0)

输出

  • .将to更改find为正确的目录,即当前目录。例如find /path/to/directory ....

  • 删除所有内容echo以便它能够完成其工作。

  • 我可能需要更多的错误检查、代码重构,但这留给你作为练习

答案2

您可以从目录中调用以下方法调用重命名脚本root

[gnubeard@mothership: ~/root]$ tree
.
└── year
    └── MM-Month
        └── YYMMTT_Event
            ├── 01 Photos
            ├── 01 Screenshots
            ├── 02 Video
            ├── File.xy2z.jpg
            ├── File.xy2z.raw
            ├── File.xy3z.jpeg
            ├── File.xy3z.nef
            ├── File.xyz2.mov
            ├── File.xyz2.mpeg
            ├── File.xyz2.png
            └── Template.txt

6 directories, 8 files
[gnubeard@mothership: ~/root]$ find . -maxdepth 4 -type f -exec ~/renamer {} \;
[gnubeard@mothership: ~/root]$ tree
.
└── year
    └── MM-Month
        └── YYMMTT_Event
            ├── 01 Photos
            │   ├── File.xy2z.jpg
            │   ├── File.xy2z.raw
            │   ├── File.xy3z.jpeg
            │   └── File.xy3z.nef
            ├── 01 Screenshots
            │   └── File.xyz2.png
            ├── 02 Video
            │   ├── File.xyz2.mov
            │   └── File.xyz2.mpeg
            └── YYMMTT_Event.txt

6 directories, 8 files

这是一个小重命名脚本的示例,您可以轻松扩展它来处理任意文件类型。

#! /usr/bin/env bash
DIRNAME=$(dirname "$1")
PARENTNAME=$(basename "$DIRNAME")
case $(basename "$1") in
  Template.txt)
    mv "$1" "${DIRNAME}/${PARENTNAME}.txt"
    ;;
  "${PARENTNAME}.txt") # Prevents attempted handling of YYMMTT_Event.txt
    ;;
  *.jpg|*.jpeg|*.nef|*.raw)
    mv "$1" "${DIRNAME}/01 Photos/"
    ;;
  *.png|*.gif)
    mv "$1" "${DIRNAME}/01 Screenshots/"
    ;;
  *.mov|*.mpeg)
    mv "$1" "${DIRNAME}/02 Video/"
    ;;
  *)
    echo "Unhandled filetype for $1"
    ;;
esac

相关内容