如何将文件一张一张复制到不同的文件夹中?

如何将文件一张一张复制到不同的文件夹中?

在目录中,我有以下名称的文件:

01.txt 02.txt 03.txt

在同一目录中的文件夹名称如下:

01.abc 02.def 03.ghi

我需要一个命令将文件一一复制到文件夹中,即01.txtis in 01.abc02.txtis in02.def03.txtis in 03.ghi。该命令不应考虑文件夹的名称,而应使用文件自上而下填充文件夹(每个文件夹一个文件)。

非常感谢!

编辑1:

我已经更改了代码将文件移动到多个文件夹[关闭]如下:

#!/bin/bash

LISTFILESCMD='ls *.txt' 
FQUANTITY=1
FOLDERLIST=`seq -w 1 3`

for FOLDER in $FOLDERLIST; do mv `$LISTFILESCMD | head -n $FQUANTITY`   $FOLDER; done

结果是,这 3 个文件位于第三个文件夹中。

编辑2:

不,当 FQUANTITY=3 时,文件会进入第一个文件夹。

当 FQUANTITY=1 时,上面的脚本可以工作。但如果文件名或文件夹名包含空格,它就无法正常工作。

我制作了第二个脚本,它也适用于文件名中的空格,但前提是文件名包含点,并且如果文件夹名包含空格,则此脚本不起作用。我想知道,如何使其也适用于文件夹名称中的空格和/或文件名中没有点的情况:

#!/bin/bash

array1=(*/) # folder
array2=(*.*) # file

for ((i=0;i<${#array2[@]};++i)); do
    mv "${array2[i]}" "${array1[i]}"
done

谢谢!

答案1

结果是,这 3 个文件位于第三个文件夹中。

你的意思是:第一个文件夹?如果总共只有 3 个文件,为什么选择 fquantity=3?这是每个文件夹的文件数量!

我测试了 for 循环,到目前为止它有效。您必须选择正确的“数量”才能将文件均匀地分配到目录中。

你的Q确实有点难以理解,你给出的文件名和数量。并且:01.txt属于01.abc,“但不应考虑名称”。

比如说,您有 3000 个文件应移至 17 个文件夹中。或者是 x 个文件夹,每个文件夹的最大数量是 。 200 个文件?这将是第一步,简单的数学和带有计数器的循环。

接下来是“鲁棒性”(空白)和性能的问题,以及如何使用标准命令来简化“程序”。

你的例子:

for FOLDER in $FOLDERLIST; do mv `$LISTFILESCMD | head -n $FQUANTITY`   $FOLDER; done

在某种程度上很优雅,因为它不需要文件列表:它读取其余的(未移动的)文件。而且它应该足够快,因为您只需使用一个大mv命令填充每个文件夹一次。

通过为 (fquantity) 选择正确的参数,head我可以根据需要将 7 个文件移动到 3 个目录 --- 我以为我想要 3-3-1。但如果我选择数量“7”,我会在第一个目录中获得所有 7 个文件。使用“1”我得到 1-1-1 和四个未移动的文件。理想的情况是 3-2-2...所以也许所涉及的数学并不是那么简单。

但是:带有空格的文件名不会被移动,并且mv.作者似乎很惊讶并评论道:哦,一定是空格问题

答案2

您的数组解决方案甚至应该适用于包含空格的文件,因为您做过正确引用扩展。不过,您可能会遇到以破折号开头的文件名问题,但可以使用mv -- file dir/它来防止这种情况(或放在./通配符前面:./*而不是*等)。

至于仅选择文件,我认为没有办法直接在 Bash 中完成(不过 zsh 可以做到)。但我们可以选择所有内容的列表并从中过滤常规文件:

#!/bin/bash

dirs=(*/)   # directories
tmp=(*)     # everything
files=()    # files

for f in "${tmp[@]}"; do
    if [ -f "$f" ]; then
        files+=("$f")
    fi
done

for ((i=0 ; i < ${#dirs[@]} ; ++i)); do
    mv -- "${files[i]}" "${dirs[i]}"
done

相关内容