我正在尝试运行一个命令来更改所有.DS_Store目录及其所有子目录中的文件递归地。
到目前为止,我一直在使用以下命令来查找文件,将其修改日期设置为Jan 1 01:01:01 2001
,然后找到它们并将其权限设置为read only
用户、组和所有人。
find . -name '.DS_Store' -print0 | xargs -0 sudo touch -t 200101010101
find . -name '.DS_Store' -print0 | xargs -0 sudo chmod 444
我猜测有一种更有效的方法可以使用单个命令来执行此操作,但我不确定如何find
在多个后续命令中使用该命令的输出。
理想情况下,如果任何文件/命令遇到任何错误/故障,我希望命令行停止并输出错误消息,而不是继续执行。我在其他地方看到使用&&
一行上的命令分隔符可以实现这一点,但我不确定如何将其与命令的输出结合使用find
。
这个问题是关于我正在尝试完成的一项较大任务的一小部分。除了部分脚本似乎只有在我直接从终端运行时才有效之外,我现在几乎已经完成了所有工作。以下是主要问题的链接,以防有人能提供帮助:对选定文件夹执行一系列命令的服务,以消除 Finder 中 .DS_Store 文件的问题
答案1
您可以使用该-exec
选项并将其输出用作子 shell 的参数来实现这一点:
find . -name '.DS_Store' -exec zsh -c 'touch -t 200101010101 "$1" && sudo chmod 444 "$1" || echo "$1" >> errors.txt' zsh {} \;
如您所见,我使用zsh {}
将参数传递给zsh -c
,这使我能够通过使用 find 的输出$1
。请注意,这里需要使用双引号,例如,以避免包含空格的文件名导致问题。
我习惯&&
仅在前一个命令没有错误退出时才继续执行下一个命令。
如果发生错误,||
允许我在失败时运行命令,例如将文件名写入文件errors.txt
。
答案2
怎么样:
find . -name '.DS_Store' -exec sudo touch -t 200101010101 {} + -exec sudo chmod 444 {} + -print
(请记住,-exec 和 + 会构建一个以所有文件为参数的单个命令)