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