迭代目录时,测试这些项目是文件还是目录

迭代目录时,测试这些项目是文件还是目录

首先,我比新人还新,很抱歉这么长,但论坛规则要求提供详细信息。

也很抱歉,这打印出来很奇怪。

这就是我想做的:我被困在(B)部分

您创建的脚本必须仅对代码中的所有路径使用相对路径。您必须假设该脚本是从 ~ 目录运行的。

(A) 创建一个 shell 脚本,循环访问用户使用“read”内置命令指定的目录中的所有项目。该脚本必须验证输入并使用循环以仅允许脚本在验证完成后继续进行。它必须验证给定的目录是一个目录。

(B) 脚本在迭代目录中的项目时,应测试这些项目以查看它们是目录还是文件。

  • (B.1) 如果它们是目录,则脚本需要循环遍历目录并计算目录内的项目数(不是递归)。该脚本需要将目录名称及其内部文件(和文件夹)的数量输出到名为“~/sorter/directory_listing.txt”的文件的同一行。

  • (B.2) 如果它们是文件,则需要使用 du 和人类可读的输出来检查它们的大小。您的脚本必须将大小后跟一个空格,然后将文件名写入文件“~/sorter/files_and_sizes.txt”的新行。

(C) 循环完成后,files_and_sizes.txt 文件需要进行人类可读的排序,然后输出到文件 ~/sorter/files_sorted.txt Directory_listing.txt 文件需要按目录中的项目数反向排序并输出到名为 ~/sorter/dir_reverse.txt 的文件

我的尝试:

read -p "Please enter a directory " chosen_dir

while [[ ! -d "$chosen_dir" ]]
do
 echo Please enter a valid directory && read chosen_dir
done

for i in $chosen_dir/*;

    do
        counter=$((counter+1))
        if [ -d "$chosen_dir" ]; then
            ls "$chosen_dir" | wc -l > sorter/directory_listing.txt
        else
            if [ -f "$chosen_dir" ]; then
                du -sh "$chosen_dir"/* > sorter/files_and_sizes.txt
        fi
    done

结果:

blahblah@vm1:~$ ./taratest.sh
Please enter a directory testsort
./taratest.sh: line 26: syntax error near unexpected token `done'
./taratest.sh: line 26: `    done'

当我删除时,done我得到这个......

新结果:

blahblah@vm1:~$ ./taratest.sh
Please enter a directory testsort
./taratest.sh: line 27: syntax error: unexpected end of file

然后:我在迭代目录时在这里搜索,测试这些项目是否是 bash 中的文件或目录

并改为:

脚本的第一部分,然后......

for i in "$chosen_dir"/*

do
    [ -f "$chosen_dir" ] && echo "is File"

    [ -d "$chosen_dir" ] && echo "is Directory"


done

我知道输出不是说明中的内容,我只是为了测试目的而回显

结果:

Please enter a directory testsort

is Directory

is Directory

is Directory

is Directory

2 个是文件,2 个是目录,为什么说 4 个目录

blahblah@vm1:~$ ls -lh testsort
total 8.0K
drwxrwxrwx 2 blahblah student 68 Jun  4 17:41 dir1
drwxrwxrwx 2 blahblah student 68 Jun  4 17:41 dir2
-rwxrwxrwx 1 blahblah student  0 Jun  4 17:41 file1.txt
-rwxrwxrwx 1 blahblah student  0 Jun  4 17:41 file2.txt

非常感谢任何有关解决方案的指导。

答案1

问题是你有这样的构造:

for [stuff]; do
   if [test]; then
       [stuff]
   else
       if [test]; then
          stuff
   fi
done

你有两个嵌套的if,这很好,但你只能用 终止其中一个fi。您需要执行以下操作之一:

# Alternative one:
for [stuff]; do
   if [test]; then
       [stuff]
   else
       if [test]; then
          stuff
       fi
   fi
done

# Alternative two
for [stuff]; do
   if [test]; then
       [stuff]
   elif [test]; then
       stuff
   fi
done

答案2

另一个问题是,当您使用 测试变量时,您(正确地)引用了该变量-d,但未能在for循环中引用它。

代替:

for i in $chosen_dir/*;

    do

使用:

for f in "$chosen_dir"/*; do

(名称更改和空格更改是样式点;添加的双引号很重要。)


我不知道你想用计数器做什么,因为你从未真正使用过它。您也没有引用$i$f在我的版本中),它基于上面给出的构造将依次for包含 中每个文件(或子目录)的名称。"$chosen_dir"

顺便说一句,感谢您指定这是家庭作业。可能有更短的解决方案,但是如果您修复语法错误并且还可以,那么您的一般方法就很好引用你的变量


对于子目录中的文件计数,您可能无法使用所使用的命令获得准确的计数。 (实际上你会绝不使用命令获取准确的计数:ls "$chosen_dir" | wc -l因为您没有测试子目录,而是测试用户输入的目录。)ls您可以考虑使用而不是仅仅使用 ,ls -1 -A "$i"以便行计数能够提供文件的准确计数子目录内。 (man ls有关-1-A标志的详细信息,请参见 参考资料。)

这仍然无法正确处理包含换行符的文件名,但对于家庭作业,我非常非常怀疑您是否会因此而扣分。 (生产中实际使用的许多脚本在包含换行符的文件名上也会失败;此类名称几乎只来自恶意用户。)


我想你可以自己计算出 C 部分。 ;)(看看man sort您是否需要,也可以sort在此网站上搜索标签。)

相关内容