使用 bash 脚本根据名称移动文件夹
Using bash script to move folders based on their name
我有一个包含目录列表的文件 (list.txt),我想读取每一行,然后根据目录名称中的数字范围将文件夹移动到特定的目标文件夹。无论文件中列出了多少个目录,它都需要工作,因为它每天都会更改。
在list.txt中,每一行都这样列出目录;
/20211601_113212_hello_LGD_text.csv/KLS_8938I1_02020721_1/
我只对粗体文本感兴趣,前提是该数字在某个范围内,例如1-500 我想把它移动到 'folder1',或者 500-100 'folder2' 等等。该数字将始终位于 _1/ 之前并且始终是 4 个数字。
正在使用
grep -0 '......$' /list.txt | cut -d_ -f1
我已经设法找到了我想要的号码,但我无法对这些信息做任何事情。我想我可以将每一行拆分成单独的文件,然后使用 for 循环遍历每个文件,但我不知道这将如何工作。有什么建议吗?
declare -i number
while IFS= read -r directory; do
((number = 10#"${directory: -7:-3}"))
echo mv "${directory%/}" "folder$(((number + 499) / 500))/"
done < list.txt
- 上面突出显示的语法有问题,
#
在这种情况下不是评论的开始。 for
-cycle 读取整行而不混淆空格并且不考虑反斜杠转义。这是为了确保目录名称可以(几乎)任意。- 我们提取数字的方式是从倒数第 7 个字符开始,到倒数第 3 个字符之前结束(均从 1 开始)。或者,也可以使用
${directory%_1/}
. 删除 - 我们将数字视为整数 (
declare -i
) 并确保它 而不是 被解释为八进制数 (10#
),因为否则以0
开头的整数文字是八进制的(例如$((08))
会产生错误)。 - 我们生成
mv
命令——一旦满足输出就删除echo
——其中${directory%/}
去掉最后的斜线(你可能想调整)然后$(((number + 499) / 500))
生成所需的基于 1 的“文件夹”编号,例如499
产生1
,500
产生(仍然)1
,501
产生2
等。您需要根据自己的喜好进行调整。
_1/