如何对目录及其 sun 目录中的所有扩展名的所有文件运行 dos2unix?

问题描述

假设我在一个名为 Folder文件夹中。该文件夹包含多个文件类型不同的文件,以及多个名为 SubFolder1SubFolder2 等的子文件夹。这些子文件夹中的每一个都包含文件和子文件夹。我想对文件夹中的所有文件运行 dos2unix,无论它们是在主文件夹中还是在几个子目录之一中。绝对的一切。我怎样才能做到这一点?据我所知,正在运行

dos2unix *

仅适用于位于主文件夹中的文件

解决方法

第一个解决方案(通用)

The standard find program 专为此类任务而设计。类似的东西:

find Folder/ -type f -exec dos2unix '{}' '+'

这个命令

  1. 递归探索Folder/
  2. 选择所有类型为 f 的文件(常规文件,与目录、符号链接和其他类型的特殊文件相反),
  3. 并使用所有选定的文件名执行 dos2unix

'{}' 是一个占位符,表示您希望在命令中插入文件名的位置,'+' 终止所述命令。您还可以为每个 文件名运行 dos2unix 一次(通过将 '+' 更改为 ';'),但由于 dos2unix 接受任意数量的输入参数,最好使用它(因为它可以避免产生许多进程)。

find 有更多选项,您可以在手册页(上面的链接)中找到它们。

第二种解决方案(针对您的问题)

如果你的shell是Bash,Bash支持递归通配符(其他shell比如zsh可能也有类似的功能)。默认情况下它是禁用的,因此您必须更改 shell 选项:

shopt -s globstar

那么,** 是一个通配符,它​​递归地选择所有内容(包括目录和其他特殊文件,因此您可能需要对其进行过滤)。之后,您可以尝试:

dos2unix Folder/**

如果您希望通配符真正选择所有内容,包括以点开头的文件名(隐藏文件),您还需要设置另一个选项:shopt -s dotglob