将 n 个文件从一个文件夹复制到另一个文件夹

将 n 个文件从一个文件夹复制到另一个文件夹

我有一个包含 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)并对每个为k3 的倍数的文件进行操作。由于我从 0 开始计数器,因此它将向上舍入;例如,如果您有十个或十一个文件(或十二个),它将移动其中四个。 

如果当前目录中有子目录(或特殊文件,如 FIFO),而你想移动其中的 ⅓纯文件,其他的保持不变,将上面的内容改为

k=0; 对于文件*
    如果[ -f "$文件" ] &&  [ $((k++ % 3)) -eq 0 ]
    然后
        mv“$file”目标/
完毕

如果你想进入子目录,说

shopt -s globstar

并使用**而不是*。如果要包含以点 ( .) 开头的名称,还必须shopt -s dotglob

上述解决方案适用于任意文件名,甚至包括换行符。

相关内容