Bashで長さ0のファイルを削除する

Bashで長さ0のファイルを削除する

Linux端末内でファイルに移動し、ファイルが空の場合は削除するbashスクリプトを作成したいと思います。

#!/bin/bash
echo " Enter name of a directory"
read Dir
for Directory in $( ls $HOME )
do 
  test -d $HOME/$dir
  if [ $# -eq 0 ]
  then 
    for filename in $( ls $HOME/$Dir )
    do 
      test -d $HOME/$dir/$filename
      if [ ! -s "$filename"  ]
      then
        rm $HOME/$dir/$filename
      else 
        echo " not empty"
      fi 
    done 
  else 
    echo " $Dir is not a directory" 
  fi 
done

これは私が使っているコードですが、うまくいきません。生成されたファイルを認識しますが、空でも削除しません。 Salahはそのようなファイルやディレクトリを表示しません

答え1

編集1(Erik Renouf)永続性The Open Group Base Spec Issue 6で指定されたコンテンツを探す

編集2(ワイルドカード)+記号と生{}

これを試して交換してください。私のディレクトリ次のコマンドラインに、計算するディレクトリ名を入力します。

find "${HOME}"/mydir -size 0 -type f -exec rm {} +

"${HOME}"/mydir ディレクトリとそのサブディレクトリ (存在する場合) にあるすべての空のファイルを削除します。

スクリプトのバージョンは次のとおりです。

#!/bin/bash --
find "${HOME}"/"${1}" -size 0 -type f -exec rm {} +

テスト

以下に空のファイルをすべてリストしてください。テスト:

$ find "${HOME}"/testd -size 0 -type f
/home/jay/testd/empty_file.txt

空のファイルを削除するには、スクリプトを使用してください。

$ chmod +x clearner.sh
$ ./clearner.sh testd

空のファイルを確認してください。

$ find "${HOME}"/testd -size 0 -type f
$

答え2

find特殊文字を含むファイル名を非常にうまく処理するので、使用するのが好きです。find@Jayが提案したものと似ているか、より移植可能な方法でGNUを使用して実行できます。

find "$HOME/$dir" -type f -size 0c -exec rm {} +

$HOME/mydirすべてのサブディレクトリを探します。サイズ0バイト(-size 0c)のすべてのファイル(-type f)にはその名前が引数として適用され、各ファイルを呼び出すのではなく(呼び出す代わりに)多くの引数を持つコマンドラインをrm持つことになります。rm+\;-exec

サブディレクトリに移動したくなく移植可能にするには、次のようにします。現在のシェルの現在のディレクトリで変更されないようにサブシェルに入れます。

( cd "$HOME/$dir"; find . ! -name . -prune -type f -size 0c -exec rm {} + )

これは追加のディレクトリが入力されるのを-prune防ぎ、ディレクトリを削除して降順のディレクトリリストの一部になるのを防ぎます。どちらの結果も、現在のディレクトリの結果のみを報告します。find.find

これで現在ディレクトリになっているので、メソッドに再びアクセスしながら作成していたスクリプトに再びアクセスできます。

スクリプトで試す作業には注意が必要です。スペースやタブなどの文字を含むすべてのファイルは、IFSforループがファイル名の一部を解決するようにします(たとえば、ファイルを呼び出すと複数のwith space反復から合計が得られますwith)。spaceディレクトリ内のファイルを繰り返すには、次のようなものを使用することをお勧めします。

for f in $HOME/$dir/*; do
    if [ -f "$f" ] && [ ! -s "$f" ]; then
       printf "It's an empty file: %s" "$f"
    fi
done

.このglobソリューションは、dotglobを有効にしない限り、whileで始まるファイルを選択しません。

関連情報