问题描述
假设我在一个名为 Folder
的文件夹中。该文件夹包含多个文件类型不同的文件,以及多个名为 SubFolder1
、SubFolder2
等的子文件夹。这些子文件夹中的每一个都包含文件和子文件夹。我想对文件夹中的所有文件运行 dos2unix,无论它们是在主文件夹中还是在几个子目录之一中。绝对的一切。我怎样才能做到这一点?据我所知,正在运行
dos2unix *
解决方法
第一个解决方案(通用)
The standard find
program 专为此类任务而设计。类似的东西:
find Folder/ -type f -exec dos2unix '{}' '+'
这个命令
- 递归探索
Folder/
, - 选择所有类型为
f
的文件(常规文件,与目录、符号链接和其他类型的特殊文件相反), - 并使用所有选定的文件名执行
dos2unix
。
'{}'
是一个占位符,表示您希望在命令中插入文件名的位置,'+'
终止所述命令。您还可以为每个 文件名运行 dos2unix
一次(通过将 '+'
更改为 ';'
),但由于 dos2unix
接受任意数量的输入参数,最好使用它(因为它可以避免产生许多进程)。
find
有更多选项,您可以在手册页(上面的链接)中找到它们。
第二种解决方案(针对您的问题)
如果你的shell是Bash,Bash支持递归通配符(其他shell比如zsh可能也有类似的功能)。默认情况下它是禁用的,因此您必须更改 shell 选项:
shopt -s globstar
那么,**
是一个通配符,它递归地选择所有内容(包括目录和其他特殊文件,因此您可能需要对其进行过滤)。之后,您可以尝试:
dos2unix Folder/**
如果您希望通配符真正选择所有内容,包括以点开头的文件名(隐藏文件),您还需要设置另一个选项:shopt -s dotglob
。