我已经创建了一个小脚本来测试获取当前目录中所有文件的基本名称。我想将它们全部输出到文件output.txt
但是使用for循环,当然每次都会覆盖该文件。使用下面的代码,我怎么能修改它只是将每个代码附加到文件的末尾(简单地)?
#!/bin/bash
files=$(find -size +100)
for f in $files; do
basename "$f" > output.txt
done
exit
答案 0 :(得分:3)
或oneliner:
find -size +100 -exec basename "{}" \; >> output
答案 1 :(得分:3)
使用MrAfs的建议并将重定向移动到循环的末尾。使用>
代替>>
,您不必明确截断文件。
此外,使用while read
循环以便在文件名中有空格的情况下工作。最后的exit
是多余的。
#!/bin/bash
find -size +100 | while read -r f
do
basename "$f"
done > output.txt
在某些情况下,您需要避免创建子shell。您可以使用流程替换:
#!/bin/bash
while read -r f
do
basename "$f"
done < <(find -size +100) > output.txt
或即将发布的Bash 4.2:
#!/bin/bash
shopt -s lastpipe
find -size +100 | while read -r f
do
basename "$f"
done > output.txt
答案 2 :(得分:2)
您应该使用>>
附加到文件而不是>
。
答案 3 :(得分:2)
您可以重定向bash结构
#!/bin/bash
files=$(find -size +100)
for f in $files; do
basename "$f"
done > output.txt
exit
答案 4 :(得分:1)
你可以这样做:
rm -f output.txt
for f in $files; do
basename "$f" >> output.txt
done
或者这个:
for f in $files; do
basename "$f"
done > output.txt
答案 5 :(得分:1)
不调用basename:
find -size +100 -printf "%f\n" > output.txt