我正在编写一个脚本来帮助我整理文件。本质上,我希望脚本根据扩展名组织我的文件。当前的解决方案查看给定目录中的所有内容。这是一个问题,因为名称中带有点的文件夹会被移动。
我想知道是否有if statement
可用于检查目录是否为实际目录的工具。如果它确实是一个目录,那么脚本不应该移动它。
这是代码部分。我正在使用 afor loop
来遍历文件,这大致基于我在 Windows 中使用的旧批处理脚本,因此这可能不是最好的方法。如果有更好的解决方案,请告诉我:
#!/bin/bash
for i in *.*; do
filename=$(basename -- "$i")
extension="${filename##*.}"
extension="$extension"files
mkdir -p "$extension"
mv "$i" "$extension"
done
我个人会使用 a
find
和 awhile
循环,因为您可以-type d/f
分别使用 for directory/file指定文件类型作为目录中的“一个班轮”,您将从以下位置运行它:
或者在脚本中:
解释
find .
- 从当前目录中查找文件和目录-maxdepth 1
- 只检查当前目录(2 也会检查下一级目录)-type f
- 只匹配文件-name *.*
- 任何带有“.”的文件 在名字里我还将扩展名更改为
.files
在一个变量声明中,因为我认为这就是您想要的。如果你想说tmp.txt
在一个被调用的目录中tmp.txtfiles
(就像你当前的脚本中一样),那么只需删除“。” 像这样:编辑:
因此,正如@Kusalananda 指出的那样,遍历 a
find
可能不是一个好主意。话虽这么说,你仍然可以使用find
这个,只是使用一个临时文件来循环:我将提出另外两种方法;一个来自 Kusalananda 的评论,一个来自另一个 shell。
首先,bash(和其他 shell)有一个简单的
test
运算符来查看某物是否是一个目录[ -d something ]
:你可以这样使用它:上面的代码会检查通配符中的每个“文件”,
*.*
看它是否是一个目录;如果是,则测试通过并且循环继续下一个项目(如果有)。或者,您可以使用 zsh,它具有广泛的通配符功能,其中之一是将匹配限制为某些类型的文件(常规文件、目录等)。你可以像这样使用它:
的特殊语法
(.)
是“glob 限定符”;括号表示它是一个限定符,句点表示我们正在寻找普通文件。结果是for
循环将只匹配文件——从不匹配目录。您可以
-f
在if
语句中使用来检查它是否是一个文件:-d
可以用来判断它是否是一个目录,!
可以加上前缀来反转逻辑,即检查变量是否不是文件: