我有一个名为 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
在覆盖目标目录中的任何文件之前要求确认。我们在这里用它作为安全措施。