在目录中,我有以下名称的文件:
01.txt 02.txt 03.txt
在同一目录中的文件夹名称如下:
01.abc 02.def 03.ghi
我需要一个命令将文件一一复制到文件夹中,即01.txt
is in 01.abc
、02.txt
is in02.def
和03.txt
is 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