Bash 命令'file'无法打开*.txt

Bash 命令'file'无法打开*.txt,bash,Bash,我正在练习使用命令read: $ ls * | while read line; do printf "test %s\n" $line; done test data1.txt test data5.txt test data6.txt test data7.txt 它工作正常,但是 $ ls * | while read line; do file $line; done data1.txt: cannot open `data1.txt' (No such file or direct

我正在练习使用命令
read

$ ls * | while read line; do printf "test %s\n"  $line; done
test data1.txt
test data5.txt
test data6.txt
test data7.txt
它工作正常,但是

$ ls * | while read line; do file $line; done
data1.txt: cannot open `data1.txt' (No such file or directory)
data5.txt: cannot open `data5.txt' (No such file or directory)
data6.txt: cannot open `data6.txt' (No such file or directory)
data7.txt: cannot open `data7.txt' (No such file or directory)
data8.txt: cannot open `data8.txt' (No such file or directory)
文件名是合法的

$ ls
data1.txt  data5.txt  data6.txt  data7.txt  data8.txt

我的代码有什么问题。

我怀疑您的文件不是名为
“data1.txt”
,而是更像
“data1.txt”
。请注意结尾处的细微空格。这很可能是由于脚本中的一个小错误造成的。也可能是使用了无法打印的字符。您可以使用
ls--quoting style=shell escape
检查这一点

例如:

$ touch "data1.txt "
$ touch "data2.txt"
$ echo "a" > "data3.txt "
$ ls data* | while read line; do file $line; done
data1.txt: cannot open (No such file or directory)
data2.txt: empty
data3.txt: cannot open (No such file or directory)

         ^
Notice the missing spaces
这一行有几个问题:

  • 。这实际上是这里的主要问题
  • 因此,如果要解决
    读取问题,请执行以下操作:

    $ ls data* | while IFS= read -r line; do file "$line"; done
    data1.txt : empty
    data2.txt: empty
    data3.txt : ASCII text
    
             ^
    Notice the spaces, this is due to read
    
    但正确的方法是:

    $ for f in data*; do file "$f"; done
    data1.txt : empty
    data2.txt: empty
    data3.txt : ASCII text
    

    我怀疑您的文件并不是被称为
    “data1.txt”
    ,而是更像
    “data1.txt”
    。请注意结尾处的细微空格。这很可能是由于脚本中的一个小错误造成的。也可能是使用了无法打印的字符。您可以使用
    ls--quoting style=shell escape
    检查这一点

    例如:

    $ touch "data1.txt "
    $ touch "data2.txt"
    $ echo "a" > "data3.txt "
    $ ls data* | while read line; do file $line; done
    data1.txt: cannot open (No such file or directory)
    data2.txt: empty
    data3.txt: cannot open (No such file or directory)
    
             ^
    Notice the missing spaces
    
    这一行有几个问题:

  • 。这实际上是这里的主要问题
  • 因此,如果要解决
    读取问题,请执行以下操作:

    $ ls data* | while IFS= read -r line; do file "$line"; done
    data1.txt : empty
    data2.txt: empty
    data3.txt : ASCII text
    
             ^
    Notice the spaces, this is due to read
    
    但正确的方法是:

    $ for f in data*; do file "$f"; done
    data1.txt : empty
    data2.txt: empty
    data3.txt : ASCII text
    

    我想不出有什么好的理由可以让你不使用
    find
    来做这件事,并且不惜一切代价避免管道
    ls
    ,这只会导致痛苦和痛苦。@jnevil有一个好的理由:
    find
    对于这项工作来说是一种过度的技能<代码>文件*
    就可以了。我会用
    ls
    以外的东西作为输入来探索它<代码>ls
    输出非常脆弱,不是一个好的学习工具。无论如何,我无法复制您在第二个示例中面临的问题。这对我来说很好。嗯,你的文件名有不能打印的字符,比如空格、制表符或换行符吗?无法复制:
    touch data{1,5,6,7,8}.txt;ls数据*.txt |读取行时;不要把$line文件归档;done
    (或pro
    find data*.txt-maxdepth 1-type f-print0 |而IFS=read-d'-r line;do file$line;done
    )永远不要解析
    ls
    :我想不出任何好的理由,为什么你不使用
    find
    来做这件事,并不惜一切代价避免,管道
    ls
    只会导致痛苦和痛苦。@jnvil有一个很好的理由:
    find
    对于这项工作来说是一种过度的技能<代码>文件*就可以了。我会用
    ls
    以外的东西作为输入来探索它<代码>ls输出非常脆弱,不是一个好的学习工具。无论如何,我无法复制您在第二个示例中面临的问题。这对我来说很好。嗯,你的文件名有不能打印的字符,比如空格、制表符或换行符吗?无法复制:
    touch data{1,5,6,7,8}.txt;ls数据*.txt |读取行时;不要把$line文件归档;done
    (或pro
    查找数据*.txt-maxdepth 1-键入f-print0 |而IFS=read-d'-r行;do file$line;done
    )从不解析
    ls