![提取特定文件名并将其放入其名称的文件夹中](https://linux22.com/image/158977/%E6%8F%90%E5%8F%96%E7%89%B9%E5%AE%9A%E6%96%87%E4%BB%B6%E5%90%8D%E5%B9%B6%E5%B0%86%E5%85%B6%E6%94%BE%E5%85%A5%E5%85%B6%E5%90%8D%E7%A7%B0%E7%9A%84%E6%96%87%E4%BB%B6%E5%A4%B9%E4%B8%AD.png)
我是 Bash、Ubuntu 16.04 的新手。
我有大量文件,看起来像:
aaaa1111
aaaa1112
aaaa1113
aaaa1114 ...
aaab1111
aaab1112
aaab1113
aaab1114 ...
aaac1111
aaac1112 ... (and so on ...)
无论如何,模式是 4 个字符 + 和数字。我要做的就是根据这4个字符建立目录,并将相应的文件放入该目录中。
例如,
aaaa1111
aaaa1112
aaaa1113
aaaa1114 ...
将被放入aaaa目录中。
aaab1111
aaab1112
aaab1113
aaab1114 ...
会被放到aaab目录下。
我尝试过“sed”、“mv”等,但效果不佳。
答案1
for file in [a-z][a-z][a-z][a-z][0-9][0-9][0-9][0-9]; do
mkdir -p "${file:0:4}" && mv "$file" "${file:0:4}"
done
-loopfor
使用四个字符和四位数字迭代当前目录中的文件名,并file
在每一步中将一个文件名分配给变量。
mkdir
创建目标目录。-p
如果目录已存在并${file:0:4}
保留当前文件名的前四个字符,则使用标志可防止出现错误消息。如果命令成功,文件将移动到此目录。
答案2
我认为这可以做到:
cd your_source_dir || exit
for file in *; do
if [[ $(echo "$file" | grep -Pw "[a-z]{4}[0-9]{4}") ]]; then
dir="${file:0:4}"
[[ -d "$dir" ]] || mkdir "$dir"
[[ -f "$file"]] && mv "$file" "$dir/"
fi
done