我从这开始:
command *
但是当目录为空时它不起作用; *通配符成为文字“*”字符。所以我改用了这个:
for i in *; do
...
done
有效,但同样,如果目录为空则不行。我使用ls:
for i in `ls -A`
但当然,其中包含空格的文件名会被拆分。我尝试了-Q开关:
for i in `ls -AQ`
导致名称仍然被拆分,只有名称开头和结尾的引号字符。我在这里遗漏了一些明显的东西,还是比它应该更难?
答案 0 :(得分:39)
假设您只想对文件执行某些操作,简单的解决方案是测试$ i是否为文件:
for i in *
do
if test -f "$i"
then
echo "Doing somthing to $i"
fi
done
你应该总是进行这样的测试,因为你几乎肯定不想以同样的方式处理文件和目录。请注意“$ i”周围的引号,以防止文件名包含空格的问题。
答案 1 :(得分:12)
find
可能是你想要的。
find . | while read file; do
# do something with $file
done
或者也许是这样:
find . -exec <command> {} \;
如果您不希望搜索包含子目录,则可能需要在find命令中添加-type f
和-maxdepth 1
的组合。有关详细信息,请参阅find man page。
答案 2 :(得分:8)
这取决于您是否要在命令提示符下键入此命令,以及您要应用于文件的命令。
如果是键入的话,你可以选择第二种选择并用命令代替无害的东西。我喜欢使用echo代替mv或rm,例如。
全部放在一行:
for i in * ; do command $i; done
当它起作用时 - 或者你可以看到它失败的地方,以及它是否无害,你可以按向上箭头,编辑命令然后重试。
答案 3 :(得分:5)
使用shopt防止扩展到* .txt
shopt -s nullglob
for myfile in *.txt
do
# your code here
echo $myfile
done
答案 4 :(得分:2)
这应该可以解决问题:
find -type d -print0 | xargs -n 1 -0 echo "your folder: {} !"
find -type f -print0 | xargs -n 1 -0 echo "your file: {} !"
print0 / 0用于避免空白问题