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
(或profind 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
: