在文件名后命名一系列目录

0 command-line shell-script

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

EX5_01.bak
EX5_02.bak
EX5_03.bak
Run Code Online (Sandbox Code Playgroud)

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

ls -l
Run Code Online (Sandbox Code Playgroud)

我得到:

EX5_01
EX5_02
EX5_03
Run Code Online (Sandbox Code Playgroud)

以此类推,其中那些是目录名,同名文件在目录中。我该怎么做?是否有我可以编写的单个命令或 Bash 脚本来实现此目的?

Kus*_*nda 7

一个简单的shell循环:

#!/bin/sh

for file in ./EX5_??.bak; do
    dir=${file%.bak}
    mkdir -p "$dir" && mv -i "$file" "$dir"
done
Run Code Online (Sandbox Code Playgroud)

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

如果您需要更精确地选择文件,您可能希望使用./EX5_[0-9][0-9].bak作为模式进行迭代。这可能是有用的,如果你也有类似的文件EX5_AA.bak,你希望在循环,包括。

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

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