我知道我能做到
tr a b < file
,但是我该怎么做呢ls
?例如,如何ls -l
从“文件”提供文件列表。我尝试了下面的方法,但没有成功。$ cat>test A B C $ ls -l < test
我不清楚“<<”或此处文档的用途。
我的课堂练习之一是使用 vi 创建一个文件,第 1 行包含“:”,第 2 行包含“6/3”。使用第 1 行作为分隔符,第 2 行作为字段,从文件中剪切并显示第 2 列。
我应该循环并将这两行读入变量吗?我用吗sed -n '#p' (file)
?有没有优雅的 1 行解决方案?
答案1
一个简单的方法是:
ls -ld -- $(< file )
(假设ksh
或兼容的外壳)
但它有一些问题,例如文件名中存在空格或通配符。所以最好使用另一种方法:
xargs -rd '\n' ls -ld -- < file
xargs
(这里假设这些-r
和选项的 GNU 实现-d
)。
答案2
ls
不从标准输入读取,因此输入重定向不执行任何操作。你想要的是命令替换。ls -l `cat list`
或者
ls -l $(cat list)
这里的文档用于将标准输入重定向到脚本中提供的固定字符串,而不是单独的文件。您也可以从命令行执行此操作,但这样做的价值有限并且并不常见。
这根本不符合逻辑。
答案3
回答第一部分:
您可以使用
while
循环将文件内容传递给“ls”命令。while read line ; do ls -l $line done < file
肮脏的方式来做到这一点:
counter=1 while read line ; do if [ $counter -eq 1 ] ; then delimiter=$line counter=$((counter+1)) elif [ $counter -eq 2 ] ; then field=$line counter=$((counter+1)) else echo File ended. fi done < inputfile