我正在尝试编写一个脚本,以便可以识别子目录中第n个最大文件的字符数。 我试图将n和子目录的名称分配给$ 1,$ 2之类的参数。
Current directory: Greetings
Sub-directory: language_files, others
Sub-directory: English, German, French
Files: Goodmorning.csv, Goodafternoon.csv, Goodevening.csv ….
我将位于目录“ Greetings”中,同时我指示子目录(英语,德语,法语),它将显示所指示子目录中的第n个最大文件,并计算字符数。
例如,如果我试图找出英语第二大文件的字符数,则可以这样做:
langs=$1
n=$2
for langs in language_files/;
Do count=$(find language_files/$1 name "*.csv" | wc -m | head -n -1 | sort -n -r | sed -n $2(p))
Done | echo "The file has $count bytes!"
我想要的结果是:
$ ./script1.sh English 2
The file has 1100 bytes!
所有问题的主要问题是我不了解bash脚本中的变量和循环是如何工作的。
答案 0 :(得分:1)
无需循环
find language_files/"$1" -name "*.csv" | xargs wc -m | sort -nr | sed -n "$2{p;q}"
对于字节计数,您应该使用-c
,因为-m
用于字符计数(可能与您相同)。
无论如何,您都不会在脚本中使用循环变量。
答案 1 :(得分:0)
重击循环很有趣。有时间的话,我们鼓励您进一步了解它们。但是,此特定问题可能不需要循环。设置lang
(如果需要,可以将其命名为langs
)和n
,然后尝试以下操作:
count=$(stat -c'%s %n' language_files/$lang/* | sort -nr | head -n$n | tail -n1 | sed -re 's/^[[:space:]]*([[:digit:]]+).*/\1/')
这应该为您提供所需的$ count。然后您可以根据自己的喜好echo
。
EXPLANATION
如果您想了解其工作原理:
stat
命令输出有关一个或多个命名文件的各种统计信息,在这种情况下,%s
是文件的大小,%n
是文件名。head
和tail
分别输出文件的第一行和最后几行。他们一起从文件中选择特定的行sed
命令将屏蔽该行的特定部分。 (如果愿意,可以改用cut
。)如果您想变得更聪明,那么可以像@karafka一样进行优化。