我有一个包含 n 个文件的文件夹。我需要将 n/2(或)n/3 个文件从该文件夹移动到任何其他文件夹。如何设置 n 的值,以便移动精确数量的文件?
答案1
find
使用、sed
和的组合xargs
:
find /path/to/dir -print0 | sed -nz '1~2p' | xargs -0 cp --target-dir=/some/dir
sed -n '1~2p'
每隔一行打印一次,从而将计数减少一半。要将其增加到三分之一,请使用1~3p
。-print0
、-z
和-0
选项表示我们使用\0
(NULL) 字符来分隔事物。
参考:
答案2
你可以做类似的事情
k=1; find source/ -type f | while read file; do
[[ k++ -le 20 ]] && cp "$file" target/
done
这将查找当前目录中的所有文件,并将找到的前 20 个文件复制到target/
。诀窍在于$k
初始化为 的变量1
。然后,[[ k++ -le 20 ]] && cp
意味着“如果 $k 加一小于或等于 20,则运行 cp 命令”。
如果您的文件名包含空格、换行符或其他奇怪内容,上述操作将失败。如果这可能是一个问题,请使用此更安全的版本:
k=1; find source/ -type f -print0 |
while IFS= read -d '' -r file; do
[[ k++ -le 20 ]] && cp "$file" target/
done
如果你不需要进入子目录,只需这样做
k=1; for file in *; do [[ k++ -le 20 ]] && cp "$file" target/ ; done
最后,为了进行n
动态计算,您可以执行以下操作(请注意,这也会计算子目录)
files=( * ); ## save all files in the current directory in an array
n=$(echo "${#files[@]} / 3 " | bc) ## get the value of n/3
for file in "${files[@]:1:$n}"; do cp "$file" bar/; done
上述解决方案应该适用于任意文件名,甚至包括换行符。
答案3
在不知道具体数目的情况下计算分数(例如 ⅓),
k=0; 对于文件* 做 如果 [ $((k++ % 3)) -eq 0 ] 然后 mv“$file”目标/ 菲 完毕
这将抓取每三个文件,通过保持运行计数器(k
)并对每个为k
3 的倍数的文件进行操作。由于我从 0 开始计数器,因此它将向上舍入;例如,如果您有十个或十一个文件(或十二个),它将移动其中四个。
如果当前目录中有子目录(或特殊文件,如 FIFO),而你想移动其中的 ⅓纯文件,其他的保持不变,将上面的内容改为
k=0; 对于文件* 做 如果[ -f "$文件" ] && [ $((k++ % 3)) -eq 0 ] 然后 mv“$file”目标/ 菲 完毕
如果你想进入子目录,说
shopt -s globstar
并使用**
而不是*
。如果要包含以点 ( .
) 开头的名称,还必须shopt -s dotglob
。
上述解决方案适用于任意文件名,甚至包括换行符。