循环遍历目录中的所有文件[重复]
Posted
技术标签:
【中文标题】循环遍历目录中的所有文件[重复]【英文标题】:Looping through all files in a directory [duplicate] 【发布时间】:2012-01-20 16:46:04 【问题描述】:我想编写一个 shell 脚本,它将遍历目录中的所有文件并回显“put $filename”。谁能指出我正确的方向?
【问题讨论】:
你试过什么?for
语句和 *
运算符的哪一部分让您感到困惑?你能更具体地说明一下你对 shell 的了解和不了解吗?
刚刚遇到这个 - 警告任何使用此作为参考的人 - 答案不能正确处理带空格的文件名......请参阅***.com/questions/7039130/…以获得更好的解决方案!!!
【参考方案1】:
对于文件和目录,不是递归的
for filename in *; do echo "put $filename"; done
仅用于文件(不包括文件夹),不用于递归
for file in *; do
if [ -f "$file" ]; then
echo "$file"
fi
done
有关递归解决方案,请参阅 Bennet Yee 的回答。
【讨论】:
如果当前目录恰好为空,则输出“put *”,而不是正确输出任何内容。可以修吗? @ThisClark - 确实如此。但我不确定答案是否完全符合您的要求是否决投票的好理由。 @ThisClark - 是的。但是对我自己很慷慨(!),有人可能会争辩说,从 *nix 的角度来看,文件夹 is 是一个文件。 (可能这就是我 7 年前写答案时的想法,但谁知道......) nix 代表什么?忽略文件与文件夹的区别是没有帮助的。 @ThisClark *nix 表示 unix、linux 等【参考方案2】:递归(包括子目录中的文件)
find YOUR_DIR -type f -exec echo "put " \;
非递归(仅该目录中的文件)
find YOUR_DIR -maxdepth 1 -type f -exec echo "put " \;
使用*
而不是YOUR_DIR
搜索当前目录
【讨论】:
我在尝试此操作时收到错误find 'dir': No such file or directory
。
愚蠢的我, dir 你的意思是用你想要的目录替换。尽管如此,还是有点混乱!
递归查找当前目录下的文件,将dir
替换为*
。
这部分是做什么的? "put " 大括号 的特别含义
使用'.'对于当前目录中的所有文件,而不是 'dir'。请注意,find 还将遍历名称以点开头的“隐藏”文件/目录。【参考方案3】:
对于当前目录下的所有文件夹和文件
for file in *; do
echo "put $file"
done
或者,如果您只想包含子目录和文件:
find . -type f -exec echo put \;
如果您想包含文件夹本身,请取出 -type f
部分。
【讨论】:
这不会列出以“.”开头的文件在 bash v3 (macOS) 中。有解决办法吗?【参考方案4】:如果您没有任何文件,那么我们可以这样做而不是打印 *。
format=*.txt
for i in $format;
do
if [[ "$i" == "$format" ]]
then
echo "No Files"
else
echo "file name $i"
fi
done
【讨论】:
【参考方案5】:使用ls
和sed
的另一种选择:
$ ls -1 <dir> | sed -e 's/^/put /'
并使用ls
和xargs
:
$ ls -1 <dir> | xargs -n1 -i%f echo 'put %f'
【讨论】:
+1,但不需要-1,你可以做 sed -e 's/^/put /' @WilliamPursell 谢谢,我已经更新了我的回复。不知何故,我误解了大括号和美元符号作为解决方案的一部分。此外,我还使用xargs
和echo
提供了另一种解决方案,但sed
更简洁。【参考方案6】:
如果您在其中有任何子目录和文件,这也将递归地工作:
find . -type f|awk -F"/" 'print "put ",$NF'
【讨论】:
以上是关于循环遍历目录中的所有文件[重复]的主要内容,如果未能解决你的问题,请参考以下文章