如何从文件夹中仅移动特定数量的图像

如何从文件夹中仅移动特定数量的图像

我有一个包含 200,000 张图片的文件夹。我想执行以下操作:

  1. 将 X 数量图像(50 张、100 张、200 张)从该文件夹移动到 Y 文件夹。
  2. 每个 Y 文件夹可以是一个数字(文件夹 1、文件夹 2、文件夹 3……)。
  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 的答案和我的答案都不关心文件类型,因此说它们只移动图像是错误的。它们移动所有文件。

希望能帮助到你。

相关内容