使用bash shell和ls命令练习

3j86kqsm  于 2023-03-13  发布在  Shell
关注(0)|答案(2)|浏览(166)

我必须创建一个shell脚本:计算具有此扩展名的文件数;计算总文件大小与此扩展名;向用户列出大小大于1000字节的(无扩展)LE的名称;要求用户确认是否删除较大文件;删除所有文件,如果用户回答肯定.我这样做,但它不为我工作,因为它不寻找扩展名键入的用户与awk.

#!/bin/bash

for file in "$@"
do

   echo "I file con estensione $file sono:"
   ls -l | awk '/$file/ {print $9}' | wc -l

   a=$(ls -l | awk '/$file/ {somma+=$5} END {print somma}')
   echo "La dimensione di tali file in totale e':$a"

   echo "I file con estensione pdf che hanno dimensione maggiore di 1000 sono: "
   ls -l|awk ' /$file/ && $5>1000 {print $9}'

   echo "Vuoi cancellarli : 
   1) Si 
   2) No 
   Digita scelta : "
   read answer
   case $answer in
   Si)
         if ls -l | awk '/$file/ && $5>1000 {print $9}' | sed '/$file/d'
         then
            echo "I file cancellati sono: "
         fi
      ;;
   No)
      echo "Non cancellati"
      ;;
 *) 
 esac
done

你能告诉我出了什么问题,我该怎么修吗?

kpbwa7wx

kpbwa7wx1#

嗯,哪个分机?我在脚本里没有看到分机的内容,大概应该是这样的:

ls -l *.$extension | ...

并且$file变量不会在''中扩展,您应该使用""或更好地将vars传递到awk中,如下所示:

awk -vfile="$file" '{...}'
fhity93d

fhity93d2#

您的脚本中有几个缺陷。让我尝试列出部分缺陷:

*斜杠引号。斜杠区分双引号和单引号。在单引号内,变量不展开。
*ls选项。可以使用-1强制每行一个文件。它比ls -l便宜。
*ls vs bash。挑战使用ls的强制性。你可以得到没有ls的文件列表,以及使用stat的大小。例如:

for ext in "$@"
do
    for file in *.$ext
    do
        size=$(stat -c %s "$file")
        #...
    done
done

*注意regex。假设您正在查找.mov文件,并且有一个名为my-movies.txt的文件。您的awk表达式也与之匹配。
*使用变量。可以在脚本询问和用户回复之间添加一个文件。更好的方法是将文件保存在一个局部变量中。
*sed vs rm. sed行编辑器删除输入行,而不是磁盘上的文件。我理解这仍然可以满足练习的要求...

相关问题