所以我有一堆格式为:的文件夹 .../course/year/...
,我经常重新组织它们,以便格式更改为:.../year/course/...
。我一直想学习如何编写 shell 脚本,而且我对自动化和 shell 脚本非常陌生,但我想制作一个脚本,当我输入要重命名的文件夹的路径时,它可以为我执行此操作。例如,我会有一个如下命令:sh reorganize.sh .../course/year/...
它会“交换”课程文件夹和年份文件夹。年文件夹内部有一些内容,交换后,年文件夹中的所有内容现在都应该位于课程文件夹中。还有多个年份文件夹,因此 2018、2019、2020 在课程文件夹内都有自己的文件夹。我感谢任何有关我如何做到这一点的帮助。
PS-当我说我相当新时,我的意思是我知道变量、管道和基本命令背后的基本知识,但除此之外没有太多知识。
答案1
#! /bin/bash
rootdir="$PWD"
shopt -s nullglob
for course in *; do
pushd "$course" >/dev/null
for year in *; do
mkdir -p "${rootdir}/${year}"
mv --no-target-directory "$year" "${rootdir}/${year}/${course}"
done
popd >/dev/null
rmdir "$course"
done
在目录之间跳转时,我认为使用绝对路径 ( rootdir="$PWD"
) 和pushd
/popd
而不是更不容易出错cd
。尽管这个相当简单的案例并不需要这样做。
mv --no-target-directory
如果脚本运行多次(前一次运行中止),应防止出现意外影响。同样,有人可能会争辩说,在这种情况下(在文件系统内移动)危险的情况不会发生。mv
根据目标目录/新路径是否存在,行为会有所不同。该选项可以防止这种情况发生。