Files

如何將 20 個文件的批次從 1000 個文件的文件夾中遞歸移動到編號的文件夾中

  • August 28, 2017

我有一個包含 1000 個(或更多)文件的文件夾。我想要一個腳本來創建一個編號文件夾,然後將前 20 個文件(按名稱排序)移動到該文件夾中。然後它應該對其他文件執行此操作,將文件夾編號增加 1,直到所有文件都在文件夾中。

我嘗試了以下命令,但它不會自動執行整個目錄,也不會自動增加文件夾編號:

N=1000;
for i in ${srcdir}/*; do
 [ $((N--)) = 0 ] && break
 cp -t "${dstdir}" -- "$i"
done

如何使用 bash 來做到這一點?

該腳本有兩個(可選)參數,分區目錄和分區大小。由於您沒有說是只想移動文件還是移動所有內容,所以我假設您的意思是文件,所以我使用了 find 命令。

幾點評論,

  • 如果您沒有指定 shell,那麼在 perl、ruby 或 python 中更容易完成類似的操作。
  • 使用 maxdepth 1 查找只執行目錄
  • 您可以將文件移動到任何地方,只需更改文件夾命名
  • 由於使用了 find,您可以添加 -name、-mtime、-ctime 等。

Copysome.sh,

#!/bin/bash
path=${1:-"."} #directory to start
howmany=${2:-20} #partition size
pushd $path; #move there
part=1; #starting partition
LIST="/usr/bin/find -maxdepth 1 -type f" #move only files?
#LIST="ls" #move everything #be careful, $folder will get moved also :-)
count=`$LIST |/usr/bin/wc -l`; #count of files to move
while [ $count -gt 0 ]; do
   folder="folder-$part";
   if [ ! -d $folder ]; then /usr/bin/mkdir -p $folder; fi
   /usr/bin/mv `$LIST |/usr/bin/sort |/usr/bin/head -$howmany` $folder/.
   count=`$LIST |/usr/bin/wc -l`; #are there more files?
   part=$(expr $part + 1)
done
popd $path

這是一個要測試的腳本(我周圍沒有額外的 1000 個文件),

for f in 0 1 2 3 4 5 6 7 8 9; do
 for g in 0 1 2 3 4 5 6 7 8 9; do
   for h in 0 1 2 3 4 5 6 7 8 9; do
       touch $f$g$h
   done
 done
done

引用自:https://unix.stackexchange.com/questions/96533