ファイルであることを確認してください [ -f file ]

ファイルであることを確認してください [ -f file ]

次のチェックはできません

for file in `ls -R .`
do
    if [-f $file] ......

問題は、file.gzgzip圧縮ファイル)が見つかり、機能しないときにこのチェックを一致させることです。

答え1

「動作しない」という意味を具体的に明記すれば、より良い助けになります。

とにかく、「[-f command not find」という出力が出たら、[と内部の間にスペースを入れる必要があります(/usr/bin/[すべての機能を備えたコマンドになるには)。

if [ -f $file ] ...

ただし、ファイルにスペースやその他の奇妙な文字が含まれる可能性があるため、少なくとも「$ file」の周りに引用符を付けることをお勧めします。

if [ -f "$file" ] ...

より良い方法は、ls -R .構文解析の代わりに以下を使用することです。find .

答え2

ls出力を解析したくありません。フォルダの下にあるすべてのファイルのリストが必要であり、各結果に対して操作を実行するには、.gzGNU、Solaris 11、または一部のBSDシステムでのように、and述語を使用してサポートすると、ここに詳細があります。bashzshfind-iname-print0

while IFS= read -r -d $'\0' file; do
    echo "found a .gz: $file"
done < <(find . -type f -iname "*.gz" -print0)

答え3

3つの質問があります。

質問は[ … ]内蔵周辺にスペースが必要です。

[ -f $file ]

もう一つの問題は、出力がls -R役に立たないことです。ls -Rディレクトリ部分なしでファイル名を表示するため、出力を比較的多く解析しないと使用できません。ディレクトリを再帰的に移動する正しいツールは次のとおりです。find、構文が異なります。

3番目の問題は、変数置換に二重引用符がないことです。スペース\[*?や。変数とコマンドの置換には常に二重引用符を使用してください。"$file"、、"$(mycommand)"。詳細については、次を参照してください。スペースやその他の特殊文字が原因でシェルスクリプトが停止するのはなぜですか?

find . -exec sh -c '
    if [ "$0" ] …
' {} \;

これを使用して、通常find -type fファイルからコマンドを実行(または出力印刷)したり(Linux上で)find -xtype f一般ファイルへのシンボリックリンクを含めたりすることもできます。

答え4

find次のコマンドを使用できます。

for file in $(find . -type f -iname "*.gz")
do
  #now if is not needed
  ...
done

これにより、ループ内でファイルをテストする必要がなくなります。

関連情報