我在Bash中遇到了一些问题。例如:
echo *
这将打印出当前目录中的所有文件和文件夹。 例如(file1 file2 folder1 folder2)
echo */
这将打印出名称后带/的所有文件夹。 例如(folder1 / folder2 /)
我怎么能只为文件选择? 例如(file1 file2)
我知道可以通过解析ls来完成,但也知道it is a bad idea。我尝试使用扩展blobbing但是无法使用它。
答案 0 :(得分:8)
如果不使用任何外部工具,您可以for loop
与glob support
一起尝试
for i in *; do [ -f "$i" ] && echo "$i"; done
答案 1 :(得分:5)
我不知道你是否可以通过globbing解决这个问题,但你可以用find来解决它:
find . -type f -maxdepth 1
答案 2 :(得分:3)
你可以像这样在bash中做你想做的事情:
shopt extglob
echo !(*/)
但请注意,这实际上做的是匹配“不是目录喜欢。”
它仍将匹配悬空符号链接,指向非目录的符号链接,设备节点,fifos等。
但它不会匹配指向目录的符号链接。
如果您想迭代普通文件而不再需要,请使用find -maxdepth 1 -type f
。
安全可靠的使用方式如下:
find -maxdepth 1 -type f -print0 | while read -d $'\0' file; do
printf "%s\n" "$file"
done
答案 3 :(得分:0)
在这种情况下,我将使用 find
命令。我只需要使用它来查找/替换给定目录中的数十个实例。我敢肯定还有很多其他方法可以给这只猫剥皮,但上面的纯 for
示例不是递归的。
for file in $( find path/to/dir -type f -name '*.js' );
do sed -ie 's#FIND#REPLACEMENT#g' "$file";
done