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
これで現在ディレクトリになっているので、メソッドに再びアクセスしながら作成していたスクリプトに再びアクセスできます。
スクリプトで試す作業には注意が必要です。スペースやタブなどの文字を含むすべてのファイルは、IFS
forループがファイル名の一部を解決するようにします(たとえば、ファイルを呼び出すと複数の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で始まるファイルを選択しません。