我有以下文件结构:
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
- 我想将所有 Template.txt 文件重命名为
YYMMTT_Event.txt
递归。 - 我想将所有照片
jpg, jpeg, nef, raw ...
移至01 Photos folder
: 。 - 我想将所有截图
png, gif
移至01 Screenshots
文件夹。 - 我想将所有视频移动
mov, mpeg
到02 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