シェルスクリプトで特定のファイル名を繰り返す場合は、すべてのサブディレクトリで "Example"文字列で始まるすべてのMKVファイルなど、シェルワイルドカードを介してそのファイル名を取得できます。 make it doneを使わずにこれを行うにはどうすればよいですかeval
?
たとえば、次のスクリプトがループを実行すると
#!/usr/local/bin/zsh
for i in /media/mybook/Example*/; do;
t="ls \"$i\"*.mkv"
s=$(eval $t)
echo $s
done
それを削除する方法はありますかeval
?
ベストアンサー1
なぜ使用するのか気になりますeval
。自分で作成してくださいs=$(ls "$i"*.mkv)
。しかし、呼び出しはls
意味がなく、ファイル名が破損しています。。ファイルを正常に繰り返します。
for dir in /media/mybook/Example*/; do;
if ! [ -d "$dir" ]; then continue; fi
for file in "$dir"/*.mkv; do
if ! [ -e "$file" ]; then continue; fi
echo "$file"
done
done
"$dir"
ディレクトリ名の特殊文字(スペースなど)がそのままになるように二重引用符内にありますが、引用符の*
外側にはワイルドカードとして扱われることに注意してください。
行は、continue
ワイルドカードの不一致の特別なケースをスキップすることです。 shでは、ワイルドカードが一致しない場合はそのままになり、1つの要素がリテラルである名前のリストがfor
表示されます/media/mybook/Example*/
(外部ループの場合)。一部のシェル(ksh、bash、zsh)にはこれを防ぐ方法があります(例:bash)。
shopt -s nullglob
for dir in /media/mybook/Example*/; do;
for file in "$dir"/*.mkv; do
echo "$file"
done
done
ファイルのみを処理し、ディレクトリに対して何もする必要がない場合は、2つのネストされたループを使用する必要はありません。
for dir in /media/mybook/Example*/*.mkv; do
if ! [ -e "$file" ]; then continue; fi
echo "$file"
done
これらすべてのフラグメントは、Example*
サブディレクトリ内のファイルではなく、ディレクトリ自体内のファイルで機能します。ディレクトリを再帰的に移動するには、次を参照してください。コサロナンダの答え。