我有一个名为 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 脚本来实现此目的?
一个简单的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
。我们在这里使用它作为安全措施。