使用 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
。
我有这种格式的文件:
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
。