使用 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/}.
  • 删除 _1/
  • 我们将数字视为整数 (declare -i) 并确保它 而不是 被解释为八进制数 (10#),因为否则以 0 开头的整数文字是八进制的(例如 $((08)) 会产生错误)。
  • 我们生成mv命令——一旦满足输出就删除echo——其中${directory%/}去掉最后的斜线(你可能想调整)然后 $(((number + 499) / 500)) 生成所需的基于 1 的“文件夹”编号,例如499 产生 1500 产生(仍然)1501 产生 2 等。您需要根据自己的喜好进行调整。