次のチェックはできません
for file in `ls -R .`
do
if [-f $file] ......
問題は、file.gz
(gzip
圧縮ファイル)が見つかり、機能しないときにこのチェックを一致させることです。
答え1
「動作しない」という意味を具体的に明記すれば、より良い助けになります。
とにかく、「[-f command not find」という出力が出たら、[と内部の間にスペースを入れる必要があります(/usr/bin/[
すべての機能を備えたコマンドになるには)。
if [ -f $file ] ...
ただし、ファイルにスペースやその他の奇妙な文字が含まれる可能性があるため、少なくとも「$ file」の周りに引用符を付けることをお勧めします。
if [ -f "$file" ] ...
より良い方法は、ls -R .
構文解析の代わりに以下を使用することです。find .
答え2
ls
出力を解析したくありません。フォルダの下にあるすべてのファイルのリストが必要であり、各結果に対して操作を実行するには、.gz
GNU、Solaris 11、または一部のBSDシステムでのように、and述語を使用してサポートすると、ここに詳細があります。bash
zsh
find
-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
これにより、ループ内でファイルをテストする必要がなくなります。