需要bash脚本自动将文件移动到子文件夹
我有一个带有320G图像的文件夹,我想将图像随机移动到5个子文件夹,只需移动到5个子文件夹。但是我对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', '
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)