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 を削除できません': そのようなファイルまたはディレクトリはありません ファイル: delDir は削除されました。rm: 削除できませdelDir2': No such file or directory File: delDir2 was removed. rm: cannot removeん e1': そのようなファイルまたはディレクトリはありません ファイル: e1 は削除されました。rm: e2': No such file or directory File: e2 was removed. rm: cannot removemake_d1 を削除できません': そのようなファイルまたはディレクトリはありません ファイル: make_d1 は削除されました。名前\t\tLinks\t\tOwner\t\t日付 検索: d1: そのようなファイルまたはディレクトリはありません 検索: delDir: そのようなファイルまたはディレクトリはありません 検索: delDir2: そのようなファイルまたはディレクトリはありません 検索: e1: そのようなファイルまたはディレクトリはありません 検索: e2: No such file or directory find: make_d1: No such file or directory ne1 2
ava 22 Nov 2009 ne2
2 ava 22 Nov 2009

私が他に何を間違っているか知っている人はいますか?

これが私のコードです:

#!/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 ステートメントでこれを実行できることはわかっていますが、これに対して or ステートメントを bash で作成することは可能ですか?

  2. スクリプトを実行すると、次のようなエラーが発生し続けます。

./delDir: 39: [!: 見つかりません./delDir: 39: [!: 見つかりません./delDir: 39: [!: 見つかりません./delDir: 39: [!: 見つかりません./delDir: 39: [!: 見つかりません./delDir: 39: [!: 見つかりません./delDir: 39: [!: 見つかりません./delDir: 39: [!: 見つかりません./delDir: 39: [!: 見つかりません. /delDir: 39: [!: 見つかりません 名前
リンク 所有者 日付 find: d1: そのようなファイルまたはディレクトリはありません find: delDir: そのようなファイルまたはディレクトリはありません find: delDir2: そのようなファイルまたはディレクトリはありません e1 1
ava 2009 年 11 月 22 日 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-oOR に等しい:

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 に答える
2

他の答えは正しいです。理由は次のとおりです。 [ はコマンドです。「[!」と入力すると、シェルはその名前のコマンドを探します。

于 2009-11-30T17:42:20.847 に答える
2

ここで他の回答を増やしています... bashの質問がI have to jump inで始まるのを見るたび#! /bin/shに、それは道徳的な義務です。

bash の POSIX 呼び出し、またはダッシュのような完全に異なる「posixically 正しい」シェルを/bin/sh指していることに注意してください。/bin/sh は、多くの場合、bash の動作をより POSIX に準拠するように変更するシンボリック リンクです。したがって、多くの便利な機能が通常どおりに機能しないか、コードが別のシェルによって解析されていることに気付く場合があります。

言い換えれば、 /bin/sh == POSIX_ME_HARDERですが、.. うわー! バシズム==です:)

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 に答える