我是bash编程的初学者。我想显示排序文件的头-n $ 1结果 按/ etc / *中的大小。问题是在最终搜索时,我必须知道已处理了多少目录和文件。
我撰写以下代码:
#!/bash/bin
let countF=0;
let countD=0;
for file in $(du -sk /etc/* |sort +0n | head $1); do
if [ -f "file" ] then
echo $file;
let countF=countF+1;
else if [ -d "file" ] then
let countD=countD+1;
fi
done
echo $countF
echo $countD
我在执行时遇到错误。如何使用find与du,因为我必须递归搜索?
答案 0 :(得分:1)
#!/bin/bash # directory and program reversed
let countF=0 # semicolon not needed (several more places)
let countD=0
while read -r file; do
if [ -f "$file" ]; then # missing dollar sign and semicolon
echo $file
let countF=countF+1 # could also be: let countF++
else if [ -d "$file" ]; then # missing dollar sign and semicolon
let countD=countD+1
fi
done < <(du -sk /etc/* |sort +0n | head $1) # see below
echo $countF
echo $countD
将循环从for
更改为while
,可以在文件名包含空格的情况下正常工作。
我不确定你有什么类型的排序,但我会接受你的说法是正确的。
答案 1 :(得分:0)
#!/bin/bash
不是#!/bash/bin
。
我不知道sort
的论点应该是什么。也许你的意思是sort -r -n
?
你对头部的使用是错误的。给头文件参数会导致它忽略它的标准输入,所以一般来说,将一些东西管道并给它一个文件参数是一个错误。除此之外,“$ 1”指的是剧本的第一个参数。您是否可能表示head -n 1
,或者您是否尝试通过参数将可处理的行数配置为脚本:head -n"$1"
。
在if
测试中,您没有引用循环变量:它应该是"$file"
,而不是"file"
。
不是bash解析器在乎,但你应该尝试缩进。
答案 2 :(得分:0)
红宝石(1.9 +)
#!/usr/bin/env ruby
fc=0
dc=0
a=Dir["/etc/*"].inject([]) do |x,f|
fc+=1 if File.file?(f)
dc+=1 if File.directory?(f)
x<<f
end
puts a.sort
puts "number of files: #{fc}"
puts "number of directories: #{dc}"
答案 3 :(得分:0)
#!/bin/bash # directory and program reversed
let countF=0 # semicolon not needed (several more places)
let countD=0
while read -r file; do
if [ -f "$file" ]; then # missing dollar sign and semicolon
echo $file
let countF=countF+1 # could also be: let countF++
else if [ -d "$file" ]; then # missing dollar sign and semicolon
let countD=countD+1
fi
done < <(du -sk /etc/* |sort +0n | head $1) # see below
echo $countF
echo $countD
我尝试使用/ etc / *而不是文件变量,但我没有看到结果。我们的想法是从目录和子目录按大小对所有文件进行排序,并显示排序的$ 1结果 文件的大小。在这个过程中,我必须知道有多少文件和目录包含目录所在的位置 我做了搜索。