如何遍历一定数量的文件夹

时间:2019-03-12 15:40:24

标签: bash shell

我试图遍历具有744个子目录的文件夹。如何仅遍历一定数量的文件夹。由于我有744个子目录,因此我会将其分成两半,并循环浏览第372个目录,然后再循环浏览其余372个目录。我想确保我不会多次复制目录。以下是我尝试执行的操作,但我想知道这样做的有效方法是避免重复。

for d in `ls -tr|tail -372`
do
echo $d
done

1 个答案:

答案 0 :(得分:1)

由于我的xargs回答未收到任何反馈,因此这是另一种方法。

printf "%s\n" */ |
awk 'BEGIN { n=1; OFS="\t"
        split("first:second:third", destination, /:/) }
    (i++ % 372)=0 { ++n }
    { print destination[n], $0 }'

这将在每个目录名称的前面添加一个字段,您可以使用该字段来进一步处理结果。样本输出:

first   directory1/
first   directory2/
first   directory3/
:
first   directory372/
second  directory373/
second  directory374/
:
second  directory743/
second  directory744/

因此,从未使用过Awk脚本中的字段值third,但无论如何,我都将其证明了可以轻松地将其扩展为进行三向分区,四向分区或具有什么功能。

您将使用此功能,例如通过管道输送到

while IFS= read -r dest dir; do
    echo mv "dir" "$dest"
done

xargs -0答案不同,这对于任意文件名而言并不可靠;特别是包含换行符的目录名称将无法正常工作。

实际上,更好的解决方案是用另一种方式拆分文件-即,对于双向分区,在每行上分别打印first,并在每行上分别打印second。这样,您就不必对项目数进行硬编码,而只需对分区数进行硬编码。

printf "%s\n" */ |
awk 'BEGIN { OFS="\t"
        n = split("ernie:bert", host, /:/) }
    { print host[1+((NR-1)% n)], $0 }' |
while IFS= read -r server dir; do
    mkdir -p "$server"
    mv "$dir" "$server/"
done

不管目录的数量如何,这都是乐观地假设您(也)可能已经用芝麻街字符命名了文件服务器,这将它们均匀地分为目录erniebert。< / p>

如果您要scp而不是mv目录,则按服务器名称将它们分组会更有效;但是如果需要,可以使用简单的sort来解决。 (这不是我们在每个文件名之前打印目标的唯一原因;它也很有用,因为这样我们就不必担心目录名可能包含我们的字段分隔符。)