我有许多文件夹,每个文件夹中都有音频文件。我想挑选出每个文件的 30% 并将它们剪切(而不是复制)到另一个文件夹。鉴于我知道每个文件夹中的文件数量,我可以看到这篇文章可以帮助我做到这一点。可悲的是,这个数字可能会改变,我想要一个可以做到这一点的管道 bash 行。这可能吗?如何选择 30% 的文件并将它们剪切到另一个文件夹?
我有许多文件夹,每个文件夹中都有音频文件。我想挑选出每个文件的 30% 并将它们剪切(而不是复制)到另一个文件夹。鉴于我知道每个文件夹中的文件数量,我可以看到这篇文章可以帮助我做到这一点。可悲的是,这个数字可能会改变,我想要一个可以做到这一点的管道 bash 行。这可能吗?如何选择 30% 的文件并将它们剪切到另一个文件夹?
使用
bash
4.4+ 并在 GNU 系统上,您可以执行以下操作:$files
用当前目录中所有文件的随机列表填充数组。然后你可以移动其中的 30%,比如:
echo
(当你满意时删除它会做你想做的事)。shell中的等价物
zsh
可能类似于:这是相同的方法,只是更简洁,不需要外部实用程序。翻译:
shopt -s nullglob
->N
glob 限定符(没有文件时创建一个空数组)。shopt -s dotglob
->D
glob 限定符(不排除名称以点开头的文件)。sort -Rz
:(noe['REPLY=$RANDOM']
通过使用随机顺序排序来打乱列表)。${array[@]:offset:length}
->$array[first,last]
(zsh 现在也支持 Korn shell 语法,但我发现 zsh 更易读)。bash
NUL 分隔记录 (-d ''
/-z
/\0
) 来处理任意文件名。不需要它,zsh
因为列表永远不会转换为单个字符串/流。您需要做的就是分别找到文件的数量和百分比。为了这
$(ls | wc -l)
将首先计算目录中的文件数$(( x * 30 /100))
将进行算术运算以找到该数字的 30%shuf -n
一个随机的文件列表。