for name in `ls` and filenames with spaces

后端 未结 3 1058
予麋鹿
予麋鹿 2020-12-01 10:43

next code doesnt work because of spaces in file names, How to fix?

IFS = \'\\n\'
for name in `ls `
do
    number=`echo \"$name\" | grep -o \"[0-9]\\{1,2\\}\"         


        
相关标签:
3条回答
  • 2020-12-01 11:16

    Looks like two potential issues:

    First, the IFS variable and it's assignment should not have space in them. Instead of

    IFS = '\n' it should be IFS=$'\n'

    Secondly, for name in ls will cause issues with filename having spaces and newlines. If you just wish to handle filename with spaces then do something like this

    for name in *

    I don't understand the significance of the line

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

    This will give you numbers found in filename with spaces in new lines. May be that's what you want.

    0 讨论(0)
  • 2020-12-01 11:19

    Just don't use command substitution: use for name in *.

    0 讨论(0)
  • 2020-12-01 11:26

    Replace

    for name in `ls`
    

    with:

    ls | while read name
    

    Notice: bash variable scoping is awful. If you change a variable inside the loop, it won't take effect outside the loop (in my version it won't, in your version it will). In this example, it doesn't matter.

    Notice 2: This works for file names with spaces, but fails for some other strange but valid file names. See Charles Duffy's comment below.

    0 讨论(0)
提交回复
热议问题