需要bash脚本自动将文件移动到子文件夹

需要bash脚本自动将文件移动到子文件夹,bash,Bash,我有一个带有320G图像的文件夹,我想将图像随机移动到5个子文件夹,只需移动到5个子文件夹。但是我对bash脚本一无所知。有人能帮忙吗?谢谢 您可以根据文件的第一个字母将其移动到不同的目录中: mv [A-Fa-f]* dir1 mv [F-Kf-k]* dir2 mv [^A-Ka-k]* dir3 任何脚本语言都可以这样做,我将在这里用Python编写: #!/usr/bin/python import os import random new_paths = ['/path1', '

我有一个带有320G图像的文件夹,我想将图像随机移动到5个子文件夹,只需移动到5个子文件夹。但是我对bash脚本一无所知。有人能帮忙吗?谢谢

您可以根据文件的第一个字母将其移动到不同的目录中:

mv [A-Fa-f]* dir1
mv [F-Kf-k]* dir2
mv [^A-Ka-k]* dir3

任何脚本语言都可以这样做,我将在这里用Python编写:

#!/usr/bin/python

import os
import random

new_paths = ['/path1', '/path2', '/path3', '/path4', '/path5']
image_directory = '/path/to/images'
for file_path in os.listdir(image_directory):
    full_path = os.path.abspath(os.path.join(image_directory, file_path))

    random_subdir = random.choice(new_paths)
    new_path = os.path.abspath(os.path.join(random_subdir, file_path))

    os.rename(full_path, new_path)
在当前图像目录中运行它,此命令将一次选择一个文件并将其移动到./DIRNAME,迭代此命令,直到没有更多文件可移动


请注意,这是反引号,而不仅仅是引号中的字符。

以下是我对此的看法。要使用它,请将脚本放在其他位置,而不是文件夹中,而是从文件夹中运行它。如果调用脚本文件rmove.sh,可以将其放入~/scripts/,然后将其cd到文件夹中并运行:

source~/scripts/rmove.sh


以下是我对这个问题的看法:

#!/usr/bin/env bash

sdprefix=subdir
dirs=5

# pre-create all possible sub dirs
for n in {1..5} ; do
    mkdir -p "${sdprefix}$n"
done

fcount=$(find . -maxdepth 1 -type f | wc -l)

while IFS= read -r -d $'\0' file ; do
    subdir="${sdprefix}"$(expr \( $RANDOM % $dirs \) + 1)

    mv -f "$file" "$subdir"
done < <(find . -maxdepth 1 -type f -print0)
可以处理大量文件 如果文件不可移动,则不烧嘴 如有必要,创建子目录 不会因不寻常的文件名而中断 相对便宜
您将想了解像cp和mkdir这样的命令。互联网上可能有一些关于它们的信息。您也可以用谷歌搜索BashThank,但我得到错误mv:cannot stat`[A-FA-f]*':没有这样的文件或目录这假设您已经创建了文件夹。否则用mkdir创建它们。是的,它会很慢,通常移动320G需要很长时间。而且,如果你真的希望它们是随机的,那就需要更长的时间。实际上,我不建议使用random.choice,而是将subdir拆分为5个偶数块,然后在此基础上移动它们。对于此脚本,我得到以下错误:~/root/ok.sh:第17行:意外标记附近的语法错误您使用的是哪个版本的bash?
#/bin/bash

ndirs=$((`find -type d | wc -l` - 1))

for file in *; do
        if [ -f "${file}" ]; then
                rand=`dd if=/dev/random bs=1 count=1 2>/dev/null | hexdump -b | head -n1 | cut -d" " -f2`
                rand=$((rand % ndirs))

                i=0
                for directory in `find -type d`; do
                        if [ "${directory}" = . ]; then
                                continue
                        fi
                        if [ $i -eq $rand ]; then
                                mv "${file}" "${directory}"
                        fi
                        i=$((i + 1))
                done
        fi
done
#!/usr/bin/env bash

sdprefix=subdir
dirs=5

# pre-create all possible sub dirs
for n in {1..5} ; do
    mkdir -p "${sdprefix}$n"
done

fcount=$(find . -maxdepth 1 -type f | wc -l)

while IFS= read -r -d $'\0' file ; do
    subdir="${sdprefix}"$(expr \( $RANDOM % $dirs \) + 1)

    mv -f "$file" "$subdir"
done < <(find . -maxdepth 1 -type f -print0)