3

编辑:这是我更新的代码:

#!/bin/sh
files=`ls`
if [ $# -ne 1 -o -f $1 ]
then
        echo "Usage: $0 <directory>"
        exit 1
fi
if [ ! -e $1 ]
then
        echo "$1 not found"
        exit 1

elif [ -d $1 ]
then
cd $1

for f in $files
do
        if [ ! -d "$f" ]
        then
           if [ ! -s "$f" ]
            then
              rm -r "$f"
        echo "File: $f was removed."
        else
        continue
        fi
fi
done


echo "Name\t\tLinks\t\tOwner\t\tDate"

for f in $files
        do
                find "$f" -type f -printf "%f\t\t %n\t\t %u\t %TH %Tb %TY\n"
        done
        exit 0
fi

我修复了所有间距问题,将 #!bin/sh 更改为 #/bin/bash,并在 "$f" 中添加了引号。但是我仍然遇到很多错误。

ava@kosh:~/test$ ./delDir d1 rm: 无法删除d1': No such file or directory File: d1 was removed. rm: cannot removedelDir': 没有这样的文件或目录 File: delDir 已被删除。rm:无法删除delDir2': No such file or directory File: delDir2 was removed. rm: cannot removee1':没有这样的文件或目录文件:e1 已删除。rm:无法删除e2': No such file or directory File: e2 was removed. rm: cannot removemake_d1':没有这样的文件或目录文件:make_d1 已被删除。Name\t\tLinks\t\tOwner\t\tDate find: d1: No such file or directory find: delDir: No such file or directory find: delDir2: No such file or directory find: e1: No such file or directory find : e2: 没有这样的文件或目录找到: make_d1: 没有这样的文件或目录 ne1 2
ava 2009 年 11 月 22 日 ne2
2 ava 2009 年 11 月 22 日

有谁知道我做错了什么?

这是我的代码:

#!/bin/sh
files=`ls`
if [ $# -ne 1 ]
then
        echo "Usage: $0 <directory>"
        exit 1
fi
if [ ! -e $1 ]
then
        echo "$1 not found"
        exit 1

elif [ -d $1 ]
then
cd $1

for f in $files
do
        if [! -d $f]
        then
           if [ ! -s $f ]
            then
              rm-r $f
        echo "File: $f was removed."
        else
        continue
        fi
fi
done


echo "Name\t\tLinks\t\tOwner\t\tDate"

for f in $files
        do
                find $f -type f -printf "%f\t\t %n\t\t %u\t %TH %Tb %TY\n"
        done
        exit 0
fi

以下是我的问题:

  1. 如果我使用不是普通文件且不是目录的东西执行脚本,我希望它说“用法:文件名目录”(见第 5 行)。我知道我可以使用 2 个 if 语句来做到这一点,但是是否可以在 bash 中为此创建一个 or 语句?

  2. 当我运行脚本时,我不断收到如下错误:

./delDir: 39: [!: not found ./delDir: 39: [!: not found ./delDir: 39: [!: not found ./delDir: 39: [!: not found ./delDir: 39: [!: 未找到 ./delDir: 39: [!: 未找到 ./delDir: 39: [!: 未找到 ./delDir: 39: [!: 未找到 ./delDir: 39: [!: 未找到。 /delDir: 39: [!: not found Name
Links Owner Date find: d1: No such file or directory find: delDir: No such file or directory find: delDir2: No such file or directory e1 1
ava 22 Nov 2009 e2
1 ava 2009 年 11 月 22 日找到:make_d1:没有这样的文件或目录 ne1 2
ava 2009 年 11 月 22 日 ne2
2 ava 2009 年 11 月 22 日

我相信我收到了这些错误,因为 for 循环首先查找用户键入的文件(它更改为的目录)并且找不到它。如果解决这个问题怎么办?3. 你还能看到更多错误吗?

4

6 回答 6

10

你忘了在行的[前后加一个空格说:]

if [! -d $f]

AND 测试使用-a,-o等于 OR 创建:

if [ ! -d $f -a -f $f ]
if [ ! -d $f -o -f $f ]
于 2009-11-30T17:38:51.123 回答
5

[尝试在和之间放置一个空格!

于 2009-11-30T17:39:04.037 回答
4

另一个问题是在脚本的开头你做

files = `ls`

但是然后您 cd 到另一个目录并尝试循环 $files 删除它们 - 当然这不会起作用,因为您已经更改了目录。

更改目录后将 ls 行移动到。

于 2009-11-30T18:01:20.217 回答
2

其他答案是正确的,原因如下: [ 是一个命令。如果您键入“[!”,shell 会查找该名称的命令。

于 2009-11-30T17:42:20.847 回答
2

我在这里增加了其他答案......每次我看到一个 bash 问题以#! /bin/sh我必须跳入开头时,这是一种道德要求。

请记住,它/bin/sh指向 bash 的 POSIX 调用,或完全不同的“正确的”shell,如 dash。/bin/sh 通常是一个符号链接,它会导致 bash 改变其行为以更符合 POSIX。因此,许多好东西不会像往常一样工作,或者您可能会发现您的代码正在被另一个 shell 解析。

换句话说, /bin/sh == POSIX_ME_HARDER,但是.. 哎呀!==是一个bashism :)

如果你想要 bash,请使用#!/bin/bash

除此之外,singingwolfboy 的回答应该可以解决您眼前的问题:)

于 2009-11-30T17:43:09.317 回答
1

其他人遇到了间距问题[,但我注意到了其他一些事情。

您可能需要rm在第 23 行的命令中添加一个空格:

rm -r $f

此外,双引号文件路径通常是一个好习惯。这将允许您的脚本正确处理带有空格和其他特殊字符的文件名。

rm -r "$f"
于 2009-11-30T17:47:48.017 回答