我试图遍历具有744个子目录的文件夹。如何仅遍历一定数量的文件夹。由于我有744个子目录,因此我会将其分成两半,并循环浏览第372个目录,然后再循环浏览其余372个目录。我想确保我不会多次复制目录。以下是我尝试执行的操作,但我想知道这样做的有效方法是避免重复。
for d in `ls -tr|tail -372`
do
echo $d
done
答案 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
不管目录的数量如何,这都是乐观地假设您(也)可能已经用芝麻街字符命名了文件服务器,这将它们均匀地分为目录ernie
和bert
。< / p>
如果您要scp
而不是mv
目录,则按服务器名称将它们分组会更有效;但是如果需要,可以使用简单的sort
来解决。 (这不是我们在每个文件名之前打印目标的唯一原因;它也很有用,因为这样我们就不必担心目录名可能包含我们的字段分隔符。)