2011-10-31 03:47:31 +0000 2011-10-31 03:47:31 +0000
106
106

Bash スクリプト: 空のディレクトリのテスト

ディレクトリにファイルが入っていないかどうかをテストしたい。もしそうならば、私はいくつかの処理をスキップします。

if [./* == "./*"]; then
    echo "No new file"
    exit 1
fi

以下を試してみました。

line 1: [: too many arguments

以下のエラーが出ます。

0x1&

解決策/代替案はありますか?

回答 (18)

135
135
135
2011-10-31 03:53:28 +0000
if [-z "$(ls -A /path/to/dir)"]; then
   echo "Empty"
else
   echo "Not Empty"
fi

あと、ディレクトリが存在するかどうかを事前に確認しておくとかっこいいですね。

24
24
24
2013-10-29 21:07:29 +0000

何もカウントしなくても、シェルグロブも必要ありません。readと組み合わせて使うこともできます。findの出力が空の場合はfindを返します。

if find /some/dir -mindepth 1 | read; then
   echo "dir not empty"
else
   echo "dir empty"
fi

これは移植可能なはずです。

20
20
20
2011-10-31 10:53:57 +0000
if [-n "$(find "$DIR_TO_CHECK" -maxdepth 0 -type d -empty 2>/dev/null)"]; then
    echo "Empty directory"
else
    echo "Not empty or NOT a directory"
fi
14
14
14
2011-11-01 14:51:09 +0000
#!/bin/bash
if [-d /path/to/dir]; then
    # the directory exists
    ["$(ls -A /path/to/dir)"] && echo "Not Empty" || echo "Empty"
else
    # You could check here if /path/to/dir is a file with [-f /path/to/dir]
fi
4
4
4
2018-09-26 13:50:40 +0000

FIND(1) (Linux と FreeBSD の場合) を使うと、"-maxdepth 0" を使ってディレクトリエントリを非再帰的に調べ、"-empty" を使ってそれが空かどうかをテストすることができます。これを問題に適用すると、以下のようになります。

if test -n "$(find ./ -maxdepth 0 -empty)" ; then
    echo "No new file"
    exit 1
fi
4
4
4
2014-10-24 01:23:28 +0000
is_empty() {
    test -e "$1/"* 2>/dev/null
    case $? in
        1) return 0 ;;
        *) return 1 ;;
    esac
}

これは、test の後に複数の引数が与えられた場合、-e ビルドインが 2 で終了するという事実を利用しています。まず、"$1"/* の glob は bash によって展開されます。これにより、1つのファイルにつき1つの引数が与えられることになる。つまり、

    • ファイルがない場合、test -e "$1"* のアスタリスクは展開されないので、Shell は * という名前のファイルを試すことに戻り、1 を返します。
  • …ただし、* という名前のファイルが実際に存在する場合は、アスタリスクが展開されてアスタリスクとなり、上記と同じ呼び出し、つまり test -e "dir/*" が 0 を返すことになります(この点を指摘してくれた @TrueY に感謝します)。

  • ファイルが1つの場合、test -e "dir/file"が実行され、0を返します。

  • しかし、ファイルが1よりも多い場合、test -e "dir/file1" "dir/file2"が実行され、bashはそれを使用エラー、つまり2として報告します。

  • 許可される引数の数よりも多くのファイルがあります。

  • あるいは、実際には空の名前のファイルが存在します。

4
4
4
2011-10-31 10:06:28 +0000

これは、現在の作業ディレクトリ(.)で動作します:

[`ls -1A . | wc -l` -eq 0] && echo "Current dir is empty." || echo "Current dir has files (or hidden files) in it."

または、同じコマンドを3行に分割して読みやすくすることもできます。

[`ls -1A . | wc -l` -eq 0] && \
echo "Current dir is empty." || \
echo "Current dir has files (or hidden files) in it."

ls -1A . | wc -lls -1A <target-directory> | wc -l に置き換えて、別のターゲットフォルダで実行する必要がある場合は、-1a-1A に置き換えてください。

Edit . 0x6& を 0x6& に置き換えました (@Daniel のコメント参照)

3
3
3
2011-10-31 10:17:15 +0000

以下のように使います。

count="$( find /path -mindepth 1 -maxdepth 1 | wc -l )"
if [$count -eq 0] ; then
   echo "No new file"
   exit 1
fi

こうすることで、lsの出力形式に依存しなくなります。-mindepth はディレクトリ自体をスキップし、-maxdepth はサブディレクトリへの再帰的な防御を防止して高速化を図ります。

3
3
3
2014-08-12 21:46:08 +0000

配列を使用します。

files=( * .* )
if (( ${#files[@]} == 2 )); then
    # contents of files array is (. ..)
    echo dir is empty
fi
2
2
2
2018-06-20 09:17:01 +0000

if文

if [[-d path/to/dir && -n "$(ls -A path/to/dir)"]]; then 
  echo "directory exists"
else
  echo "directory doesn't exist"
fi
```でディレクトリが存在していて空ではないかどうかをテストするのはどうでしょうか?
1
1
1
2013-10-29 20:57:27 +0000
files=$(shopt -s nullglob; shopt -s dotglob; echo /MYPATH/*)
[["$files"]] || echo "dir empty"

thanks to https://stackoverflow.com/a/91558/520567

これは私の回答を匿名で編集したものです。わずかな変更でファイル数が表示されます。

files=$(shopt -s nullglob dotglob; s=(MYPATH/*); echo ${s[*]}) 
echo "MYPATH contains $files files"

これはファイル名にスペースが含まれていても正しく動作します。

1
1
1
2020-02-16 18:53:46 +0000

質問内容:

if [./* == "./*"]; then
    echo "No new file"
    exit 1
fi

答えは:

if ls -1qA . | grep -q .
    then ! exit 1
    else : # Dir is empty
fi
```です。
1
1
1
2018-05-25 17:06:53 +0000
if find "${DIR}" -prune ! -empty -exit 1; then
    echo Empty
else
    echo Not Empty
fi

EDIT: 実装**簡単に*見てみたところ、この解決策はgnu findでも問題なく動作すると思います。しかし、これは例えば netbsd の find では動作しないかもしれません。実際、これは stat(2) の st_size フィールドを使っています。マニュアルには次のように記述されています。

st_size The size of the file in bytes. The meaning of the size
                   reported for a directory is file system dependent.
                   Some file systems (e.g. FFS) return the total size used
                   for the directory metadata, possibly including free
                   slots; others (notably ZFS) return the number of
                   entries in the directory. Some may also return other
                   things or always report zero.

より良い解決策は次のように記述されています:

if find "${DIR}" -mindepth 1 -exit 1; then
    echo Empty
else
    echo Not Empty
fi

また、最初の解決策の -prune は無駄です。

EDIT: gnu find では -exit がありません。GNU find では、これが動作するはずです。

if [-z "`find \"${DIR}\" -mindepth 1 -exec echo notempty \; -quit`"]; then
    echo Empty
else
    echo Not Empty
fi
0
0
0
2020-01-15 17:46:01 +0000
CHECKEMPTYFOLDER=$(test -z "$(ls -A /path/to/dir)"; echo $?)
if [$CHECKEMPTYFOLDER -eq 0]
then
  echo "Empty"
elif [$CHECKEMPTYFOLDER -eq 1]
then
  echo "Not Empty"
else
  echo "Error"
fi
```0x1&というアプローチをしてみました。
0
0
0
2018-05-02 13:29:51 +0000

スクリプトが../INディレクトリにあることを考慮して、../Scriptディレクトリ内のファイルをチェックして処理するようにしました。

FileTotalCount=0

    for file in ../IN/*; do
    FileTotalCount=`expr $FileTotalCount + 1`
done

if test "$file" = "../IN/*"
then

    echo "EXITING: NO files available for processing in ../IN directory. "
    exit

else

  echo "Starting Process: Found ""$FileTotalCount"" files in ../IN directory for processing."

# Rest of the Code
0
0
0
2012-02-24 10:06:37 +0000

これはすべて素晴らしいものです - 現在のディレクトリの下に空のディレクトリがないかチェックできるように、スクリプトにしました。以下は'findempty'というファイルに入れて、どこかのパスに置いて、bashがそれを見つけられるようにして、chmod 755で実行します。あなたの特定のニーズに合わせて簡単に修正することができると思います。

#!/bin/bash
if ["$#" == "0"]; then 
find . -maxdepth 1 -type d -exec findempty "{}" \;
exit
fi

COUNT=`ls -1A "$*" | wc -l`
if ["$COUNT" == "0"]; then 
echo "$* : $COUNT"
fi
-1
-1
-1
2018-01-10 17:12:56 +0000

カレントディレクトリ以外のディレクトリについては、rmdir を試すことで空かどうかを確認することができます。rmdir が成功しても、実際には空のディレクトリがテストに耐えられるようにしたい場合は、再度 rmdir を実行してください。

知っているディレクトリが一時的に存在しなくなることで、他のプロセスが混乱する可能性がある場合は、このハックを使用しないでください。

mkdir がうまくいかず、大量のファイルを含む可能性のあるディレクトリをテストしている可能性がある場合、シェルのグロブに依存した解決策は遅くなったり、コマンドラインの長さに制限がかかったりする可能性があります。そのような場合は、rmdir を使用した方が良いでしょう。私が考えられる最速のfindソリューションは、

is_empty() {
    test -z $(find "$1" -mindepth 1 -printf X -quit)
}

これはGNUとBSDバージョンのfindでは動作しますが、find演算子が一つ残らず欠落しているSolarisバージョンでは動作しません。オラクル、あなたの仕事を愛しています。

-3
-3
-3
2018-04-08 20:54:13 +0000

ディレクトリを削除してみてエラーが出るのを待つことができます。

_path="some/path"
if rmdir $_path >/dev/null 2>&1; then
   mkdir $_path # create it again
   echo "Empty"
else
   echo "Not empty or doesn't exist"
fi