我有一个包含 200,000 张图片的文件夹。我想执行以下操作:
- 将 X 数量图像(50 张、100 张、200 张)从该文件夹移动到 Y 文件夹。
- 每个 Y 文件夹可以是一个数字(文件夹 1、文件夹 2、文件夹 3……)。
- 最终结果可能如下所示:
文件夹 1(包含 X 张图片) 文件夹 2(包含 X 张图片) 文件夹 3(包含 X 张图片) 文件夹 4(包含 X 张图片)
答案1
在图像目录中运行脚本。确保目标没有任何子目录。
IMG=100 # 要移动的图像数量 DES="。" # 目的地 我=$(查找。-maxdepth 1-mindepth 1-type f|wc-l) N=$(( (I / IMG) + (I % IMG) )) eval mkdir "$DES"/文件夹{01..$N} 对于 $(find "$DES" -maxdepth 1 -mindepth 1 -type d | sort) 中的 i;做 mv $(find . -maxdepth 1 -mindepth 1 -type f | sort | grep -m $IMG'.*')$i 完毕
答案2
尝试这个脚本,它应该可以满足你的要求,但最后的 X 个文件将保留在原始目录中
OrigDIR=~/文件夹X 目标目录=~/文件夹Y 移动物品数量=$1 子目标目录=$2 计数=1 当 [`find $DIR -OrigDIR 1 -type f| wc -l` -gt $NumberOfMovedItems] 时;执行 NewSubDir=$DestDIR/${SubDestDir}${Count} mkdir $新子目录 查找 $OrigDIR -maxdepth 1 -type f | head -n $NumberOfMovedItems | xargs -I {} mv {} $NewSubDir 让 Count++ 完毕
根据需要更改 FolderX 和 FolderY 的路径。
运行脚本时,您必须提供要移动的项目数和子目录的名称
答案3
我会先创建一个列表
ls X > X.list
for Y in `seq 1 10` ; do mkdir $Y ; mv `head -n $(( Y * 50 )) X.list | tail -n 50` $Y ; done
答案4
关于@BasharatSialvi 的回答(尊重):
它可以工作,但有两个问题:
1- 它创建了I % IMG
额外的目录,这些目录将保持为空
。2- 它有一个经典的 bash 错误,通常称为bash 陷阱 1。
第一个问题并不严重,因为您可以删除这些额外的目录,但第二个问题在许多情况下会导致一切出错。例如当您的文件名中有空格时。
所以我增强了@BasharatSialvi 的回答:
COUNT=5 # Number of files to move
DES="." # Destination
DESFOLPRE="folder" # Prefix of the destination folders
I=$(find . -maxdepth 1 -mindepth 1 -type f | wc -l) # Find all files
N=$((I / COUNT)) # Number of directories needed
if [[ $((I % COUNT)) != 0 ]]; then N=$((N+1)); fi # Add one directory if cant fit files perfectly
eval mkdir "$DES"/"$DESFOLPRE"{01..$N} # Create directories
for i in $(eval echo {01..$N}) # For every directory move COUNT files
do
$(find . -maxdepth 1 -mindepth 1 -type f | sort | head -$COUNT | xargs -I filename mv filename $DES/$DESFOLPRE$i/)
done
请注意,Basharat 的答案和我的答案都不关心文件类型,因此说它们只移动图像是错误的。它们移动所有文件。
希望能帮助到你。