使用 bash 脚本将文件移动到各自的文件夹

moving files to their respective folders using bash scripting

我有这种格式的文件:

2022-03-5344-REQUEST.jpg
2022-03-5344-IMAGE.jpg
2022-03-5344-00imgtest.jpg
2022-03-5344-anotherone.JPG
2022-03-5343-kdijffj.JPG
2022-03-5343-zslkjfs.jpg
2022-03-5343-myimage-2010.jpg
2022-03-5343-anotherone.png
2022-03-5342-ebee5654.jpeg
2022-03-5342-dec.jpg
2022-03-5341-att.jpg
2022-03-5341-timephoto_december.jpeg
....

大约 13k 张这样的图片。

我想创建如下文件夹:

2022-03-5344/
2022-03-5343/
2022-03-5342/
2022-03-5341/
....

我开始像这样手动移动它们:

mkdir name
mv name-* name/

但是我当然不会对 13k 个文件重复这个过程。

所以我想使用 bash 脚本来执行此操作,并且由于我是 bash 的新手,并且我正在 production 环境中工作,我想谨慎行事,但它没有给我结果。这是我到目前为止所做的:

#!/bin/bash

name = 

mkdir "$name"

mv "${name}-*" $name/

我所能做的就是:./move.sh name 对于每个文件夹,我不知道如何使用循环自动执行此操作。

试试这个

xargs -i sh -c 'mkdir -p {}; mv {}-* {}' < <(ls *-*-*-*|awk -F- -vOFS=- '{print ,,}'|uniq)

或者:

find . -maxdepth 1 -type f -name "*-*-*-*" | \
awk -F- -vOFS=- '{print ,,}' | \
sort -u | \
xargs -i sh -c 'mkdir -p {}; mv {}-* {}'

或使用正则表达式查找:

find . -maxdepth 1 -type f -regextype posix-extended -regex ".*/[0-9]{4}-[0-9]{2}-[0-9]{4}.*"

你可以使用 awk

$ cat awk.script
/^[[:digit:]-]/ && ! a[]++ {
    dir=
} /^[[:digit:]-]/ {
    system("sudo mkdir " dir )
    system("sudo mv " [=10=]" "dir"/"[=10=])
}

调用脚本并用于您的目的;

$ awk -F"-([0-9]+)?[[:alpha:]]+.*" -f awk.script <(ls)

您会看到一些错误,例如;

mkdir: cannot create directory ‘2022-03-5341’: File exists

创建初始目录后,您可以安全地忽略它们,因为目录现在已经存在。

现在每个目录的内容都会有相关的文件

$ ls 2022-03-5344
2022-03-5344-00imgtest.jpg  2022-03-5344-IMAGE.jpg  2022-03-5344-REQUEST.jpg  2022-03-5344-anotherone.JPG

使用 bash 和正则表达式。我假设文件都在当前目录中。

for name in *; do
  if [[ "$name" =~ (^....-..-....)- ]]; then
    dir="${BASH_REMATCH[1]}";    # dir contains 2022-03-5344, e.g.
    echo mkdir -p "$dir" || exit 1;
    echo mv -v "$name" "$dir";
  fi;
done

如果输出看起来没问题,请删除两个 echo