以文件名命名一系列目录

以文件名命名一系列目录

我有一个名为 EX5_##.bak 的文件列表。我希望每个目录都位于名为 EX5_## 的目录中。
例子

EX5_01.bak
EX5_02.bak
EX5_03.bak

我想把它们放在目录中。所以当我打字时

ls -l

我得到:

EX5_01
EX5_02
EX5_03

依此类推,其中这些是目录名称,并且该目录中具有相同名称的文件。我该怎么办?我可以编写一个命令或 Bash 脚本来实现此目的吗?

答案1

一个简单的 shell 循环:

#!/bin/sh

for file in ./EX5_??.bak; do
    dir=${file%.bak}
    mkdir -p "$dir" && mv -i "$file" "$dir"
done

这将迭代EX5_??.bak当前目录中的所有文件(?匹配单个字符)。对于每个文件,它通过.bak从文件名中删除后缀来创建一个目录名(这就是${file%.bak}所做的)。然后,如果目录尚不存在,它将创建该目录;如果创建目录没有问题,则将文件移入该目录。

如果您需要更精确地选择文件,您可能需要使用./EX5_[0-9][0-9].bak作为迭代的模式。如果EX5_AA.bak您也有类似的文件,这可能会很有用想要包含在循环中。

-p选项mkdir使实用程序不会将其视为目录已存在的错误(它还使其创建中间目录,但在本例中并未真正使用)。

-i选项使其mv在覆盖目标目录中的任何文件之前要求确认。我们在这里用它作为安全措施。

相关内容