我有一个包含 1000 个(或更多)文件的文件夹。我想要一个脚本来创建一个编号文件夹,然后将前 20 个文件(按名称排序)移动到该文件夹中。然后应该对其他文件执行此操作,将文件夹编号增加 1,直到所有文件都在文件夹中。
我已尝试以下命令,但它不会自动执行整个目录,也不会自动增加文件夹编号:
N=1000;
for i in ${srcdir}/*; do
[ $((N--)) = 0 ] && break
cp -t "${dstdir}" -- "$i"
done
如何使用 bash 来完成此操作?
答案1
该脚本采用两个(可选)参数:要分区的目录和分区大小。由于您没有说您是否只想移动文件,或者移动所有内容,我假设您指的是文件,所以我使用了 find 命令。
一些评论,
- 如果您没有指定 shell,那么在 perl、ruby 或 python 中更容易完成类似的操作。
- find with maxdepth 1 只查找目录
- 您可以将文件移动到任何位置,只需更改文件夹命名即可
- 由于使用了find,因此可以添加-name、-mtime、-ctime等。
复制一些.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
答案2
当for
你的 filesName 以相应的数字结尾但 shell 是zsh
.
for N in {0..800..20}: do
mkdir "dir$N"
mv "files{$N..$((N+19))}" "/path/to/dir$N/"
done
如果它在 中bash
,那么:
for N in {0..800..20}: do
mkdir "dir$N"
eval mv "files{$N..$((N+19))}" "/path/to/dir$N/"
done