文件夹结构图:
我对高级 shell 命令和脚本非常陌生。我有基本的终端知识,但从未尝试过创建这样的自动化。纯粹的新手。
我在这篇文章中简化了我的目标,但实际项目将涉及几千个文件夹。
基本上,我有一个源文件夹和目标文件夹。源文件夹中的目录以“Car”为前缀,后面跟着“三个数字”
我在源文件夹中有一个名为 list.txt 的文本文件,其中每行包含“三个数字”的列表。
我想编写一个命令或脚本来查找目录并读取列表。如果目录名称中的最后三位数字与列表中的三位数字匹配。我想将匹配的文件夹移动到目标文件夹。
我读过各种方法,比如使用 find、-exec mv、xargs 和“while IFS read”,但我真的不知道最好的解决方法是什么。我才刚刚开始,希望论坛上有人能帮我解答,不要打击我。
答案1
Destination
在和的父目录中运行的脚本Source
(.
在您的图片中):
#!/bin/sh
while IFS= read -r l; do
mv "Source/Car$l/" Destination/.
done < Source/list.txt
此脚本Source/list.txt
逐行读取。对于每一行,$l
它都会尝试将名为 的目录移动Source/Car$l
到Destination/.
。
中的点路径名组件Destination/.
是一个技巧,以防Destination
不存在。如果Destination
不存在,则第一个mv "Source/Car…/" Destination/
将重命名Source/Car…/
为Destination/
,而不是将其放在里面Destination/
。点有所不同:如果目标存在Destination/.
并且Destination/
不存在,则我们的mv
命令将以错误退出。
脚本是哑的,它不会对从 读取的内容执行任何健全性检查Source/list.txt
。例如,如果一行是001/../../../../../../../../../../home/roco/.ssh
,那么脚本可能会将您的~/.ssh/
目录移动到Destination/
。如果有空行,那么脚本将尝试移动Source/Car/
。如果最后一行不完整,那么它将无法到达mv
(请参阅为什么这个while
循环不能识别最后一行?)。