web-dev-qa-db-ja.com

`ls`の名前とスペースを含むファイル名

ファイル名にスペースが含まれているため、次のコードは機能しません。修正方法

IFS = '\n'
for name in `ls `
do
    number=`echo "$name" | grep -o "[0-9]\{1,2\}"`
    if [[ ! -z "$number" ]]; then
        mv "$name" "./$number"
    fi
done
25
Yola

コマンド置換は使用せず、for name in *を使用してください。

32
fge

交換する

 `ls`内の名前

と:

 ls |名前を読みながら

通知:bash変数のスコープはひどいです。ループ内で変数を変更しても、ループ外では有効になりません(私のバージョンでは変更されませんが、バージョンでは変更されます)。この例では、それは重要ではありません。

通知2:これはスペースを含むファイル名で機能しますが、他の奇妙だが有効なファイル名では失敗します。以下のCharles Duffyのコメントを参照してください。

17
ugoren

2つの潜在的な問題のように見えます:

まず、IFS変数とその割り当てにはスペースを含めないでください。の代わりに

IFS = '\n' そのはず IFS=$'\n'

次に、for name in lsは、ファイル名にspacesおよびnewlinesが含まれる場合に問題を引き起こします。 filenamespacesで処理したい場合は、次のようにします

for name in *

線の意味がわかりません

number=`echo "$name" | grep -o "[0-9]\{1,2\}"`

これにより、filename with spaces in new lines。それがあなたの望むことかもしれません。

3
jaypal singh