【发布时间】:2018-12-05 21:47:20
【问题描述】:
我正在学习 shell 脚本,并努力在保持代码库可读性的同时尽可能地保持 POSIX 兼容。目标是从目录 A 读取文件列表,从目录 B 中找到它们的匹配项,并在目录 C 中重新创建目录父 B 的一部分,其中应该移动目录 A 中的文件,然后从中删除匹配/移动的文件目录 B,如果找到的目录 B 文件中的目录为空,则删除它们。目录 A 中的所有文件将始终彼此唯一,并且目录 B 中始终存在一个或多个匹配项,而目录 C 中永远不会匹配,但目录 C 中的子目录可能已经存在以匹配目录 B . 在将匹配项从目录 A 移动到目录 C 后,应删除目录 B 中匹配的所有文件。扩展名会随着文件的单独处理而改变,但文件名将完全匹配。文件名可能包含空格和句点。文件名并不总是相同的长度。输出目录和归档目录有两级子目录。
这是我到目前为止所得到的。我一直坚持编写 for 循环来做脏活。尽量不要超出 find、printf、awk、grep、for 和 if 的范围。
#!/bin/sh
execHome="intendedMachine"
baseDir="/home/library/projects"
folderNew="output"
folderOld="working"
folderArchive="archive"
workingTypes=("jpg", "svg", "bmp", "tiff", "psd")
$folderNew="$baseDir/$folderNew"
$folderOld="$baseDir/$folderOld"
folderArchive="$baseDir/$folderArchive"
if [ "$(uname -n)" = "$execHome" ]
then
count=$(find $folderNew -type f |grep -v "DS_Store" |awk -F "/" '{print $NF}'|wc -l)
printf "\nFound/processing %s files in the %s folder\n\n" "$count" "$folderNew"
find $folderNew -type f |grep -v "DS_Store" |awk -F "/" '{print $NF}'
else
printf "Executed from %s; Run from %s for proper execution.\n" "$(uname -n)" "$execHome"
fi
例子:
目录 A
/home/library/projects/output/projectOne 1.a.png
/home/library/projects/output/projectOne 1.b.png
/home/library/projects/output/projectOne 1.c.png
/home/library/projects/output/projectThree 3.m.png
/home/library/projects/output/projectThree 3.o.png
/home/library/projects/output/projectFour 4.t.png
/home/library/projects/output/projectFour 4.u.png
目录 B
/home/library/projects/working/House/2018 01/projectOne 1.a.jpg
/home/library/projects/working/House/2018 01/projectOne 1.a.svg
/home/library/projects/working/House/2018 01/projectOne 1.b.jpg
/home/library/projects/working/House/2018 01/projectOne 1.b.svg
/home/library/projects/working/House/2018 01/projectOne 1.c.jpg
/home/library/projects/working/House/2018 02/projectTwo 2.g.jpg
/home/library/projects/working/House/2018 02/projectTwo 2.g.svg
/home/library/projects/working/House/2018 02/projectTwo 2.h.jpg
/home/library/projects/working/House/2018 02/projectTwo 2.h.svg
/home/library/projects/working/House/2018 02/projectTwo 2.i.jpg
/home/library/projects/working/Car/2018 03/projectThree 3.m.jpg
/home/library/projects/working/Car/2018 03/projectThree 3.n.jpg
/home/library/projects/working/Car/2018 03/projectThree 3.o.jpg
/home/library/projects/working/Car/2018 03/projectThree 3.o.svg
/home/library/projects/working/Car/2018 04/projectFour 4.s.jpg
/home/library/projects/working/Car/2018 04/projectFour 4.t.jpg
/home/library/projects/working/Car/2018 04/projectFour 4.u.jpg
目录C
/home/library/projects/archive/House/2018 01/projectOne 1.d.png
/home/library/projects/archive/House/2018 01/projectOne 1.e.png
/home/library/projects/archive/House/2018 01/projectOne 1.f.png
/home/library/projects/archive/Car/2018 03/projectThree 3.p.png
/home/library/projects/archive/Car/2018 03/projectThree 3.q.png
/home/library/projects/archive/Car/2018 03/projectThree 3.r.png
期望的结果:
目录 A 文件已移至目录 C
/home/library/projects/output/
目录 B 应删除目录 A 文件并删除空文件夹
/home/library/projects/working/House/2018 02/projectTwo 2.g.jpg
/home/library/projects/working/House/2018 02/projectTwo 2.g.svg
/home/library/projects/working/House/2018 02/projectTwo 2.h.jpg
/home/library/projects/working/House/2018 02/projectTwo 2.h.svg
/home/library/projects/working/House/2018 02/projectTwo 2.i.jpg
/home/library/projects/working/Car/2018 03/projectThree 3.n.jpg
/home/library/projects/working/Car/2018 04/projectFour 4.s.jpg
目录 C 应包含旧存档和新输出文件作为存档
/home/library/projects/archive/House/2018 01/projectOne 1.a.png
/home/library/projects/archive/House/2018 01/projectOne 1.b.png
/home/library/projects/archive/House/2018 01/projectOne 1.c.png
/home/library/projects/archive/House/2018 01/projectOne 1.d.png
/home/library/projects/archive/House/2018 01/projectOne 1.e.png
/home/library/projects/archive/House/2018 01/projectOne 1.f.png
/home/library/projects/archive/Car/2018 03/projectThree 3.m.png
/home/library/projects/archive/Car/2018 03/projectThree 3.o.png
/home/library/projects/archive/Car/2018 03/projectThree 3.p.png
/home/library/projects/archive/Car/2018 03/projectThree 3.q.png
/home/library/projects/archive/Car/2018 03/projectThree 3.r.png
/home/library/projects/archive/Car/2018 04/projectFour 4.t.png
/home/library/projects/archive/Car/2018 04/projectFour 4.u.png
无论如何从 bash 4.4.19 机器上运行代码以查看它是如何工作的,但它并没有像我预期的那样工作。这是结果输出:
Found/processing 4 files in the /home/library/projects/output folder
./auto-archive.sh: line 34: hash["$proj"]: bad array subscript
parent of /home/library/projects/output/.temp/projectThree 3.m.png not found
parent of /home/library/projects/output/projectOne 1.a.png not found
parent of /home/library/projects/output/.temp/projectThree 3.0.png not found
parent of /home/library/projects/output/projectFour 4.t.png not found
我很抱歉。我之前也没有提到不应递归扫描目录 B,这在用例中会产生其他正在写入但可能尚未准备好移动的临时文件。此外,出于测试目的,只有上面列出的四个文件实际上在目录 A 中;并非最初列出的所有文件。此外,在重新创建建议的测试结构后,您的代码似乎可以完美执行;与我的实际文件结构的结果不匹配。我担心我在描述我的实际文件结构/命名约定时可能遗漏了一些关键元素。现在审查描述符差异。很抱歉耽误了时间,但您的准确性肯定给您留下了深刻的印象。感觉我们已经接近了,但肯定需要在早期版本的 bash 上运行。
【问题讨论】:
标签: bash awk find printf posix