方法

方法

方法

スペースとピリオドを含むランダムに名前が付けられたフォルダを含むディレクトリがあります。

私は小さなループを作りました(スクリプトから)このフォルダの名前を変更するには、それに基づいて私のディレクトリがあります(テストしてクリア):

$ ls -la
./
../
35._JK_io/
'43A. io kl_ -'/
'Mi.Nombre.es Adios'/

注:私たちは(creo)すべての可能性をリストし、ディレクトリとフォルダを区別するように努めました。

これで、ディレクトリのみをリストするループを作成します(未来)名前を変更するには:

for archives in `sh -c 'ls -q */' sh`

do

echo  "$archives"
done

質問

問題は、スクリプトを実行すると次のような結果が出ることです。

35._JK_io/:
43A.
io
kl_
-/:
Mi.Nombre.es
Adios/:

質問

これは起こらず、空白があり、ファイルが3つしかないのをどのように防ぐのですか?

観察する

フォルダから別のスクリプトを実行すると、1つ35._JK_io /のディレクトリは取得されますが、他の2つのディレクトリは取得されません。

ありがとうございます! !

答え1

ディレクトリを循環するとき、特にそのディレクトリに奇妙な名前がある場合は、循環しないでください。通常、Unixファイル名にはnul文字()ls以外の文字を含めることができるため、プログラム間でパス名を渡すときは非常に注意する必要があります。/\0

代わりに

for dirname in ./*/; do
    printf 'Directory name is "%s"\n' "$dirname"
done

/パターンの最後のパターンは、./*/パターンをディレクトリにのみ拡張します。これにより、変数はdirname同様の値を取得します./some directory name/./パターンの先頭に含めましたが、必要に応じて削除できます。ディレクトリ名にダッシュ(-)が最初の文字として含まれている場合は、名前のダッシュがコマンドラインオプションとして解釈されないように、後でmv -- "$dirname" "$newname"(with --)を使用する必要があります。で始まるmv場合は必要ありません。./$dirname--

これは追加変数拡張を引用することが重要です。それ以外の場合、シェルは値をトークン化し、ファイル名をワイルドカードとして指定します。

関連:

関連情報