移动名称以 - 数字结尾的目录与 list.txt 文件匹配

移动名称以 - 数字结尾的目录与 list.txt 文件匹配

文件夹结构图:

在此处输入图片描述

我对高级 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$lDestination/.

中的点路径名组件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循环不能识别最后一行?)。

相关内容