使用查找和重命名以递归方式将用户定义的字符串添加到所有文件和文件夹中。
我想将“x”(无引号)添加到目录及其所有子目录中的所有内容。我是使用 macOS Mojave 10.14.6 和终端的初学者。我下载了改名为此目的使用 Homebrew。
例子:
/Old Project
/Old Project/Abstract.rtf
/Old Project/Manuscript.docx
/Old Project/Data Analysis
/Old Project/Data Analysis/Working Syntax.sps
/Old Project/Data Analysis/Working Data.sav
/Old Project/Data Analysis/Cleaned Data.sav
/Old Project/Data Analysis/Figures
/Old Project/Data Analysis/Figures/Figure 1.png
/Old Project/Data Analysis/Figures/Figure 2.png
/Old Project/Data Analysis/Raw Data
/Old Project/Data Analysis/Raw Data/2020-06-26.csv
/Old Project/Ethics
/Old Project/Ethics/Application.pdf
/Old Project/Ethics/Approval.pdf
/Old Project/Ethics/Informed Consent.docx
期望的结果:
/x Old Project
/x Old Project/x Abstract.rtf
/x Old Project/x Manuscript.docx
/x Old Project/x Data Analysis
/x Old Project/x Data Analysis/x Working Syntax.sps
/x Old Project/x Data Analysis/x Working Data.sav
/x Old Project/x Data Analysis/x Cleaned Data.sav
/x Old Project/x Data Analysis/x Figures
/x Old Project/x Data Analysis/x Figures/x Figure 1.png
/x Old Project/x Data Analysis/x Figures/x Figure 2.png
/x Old Project/x Data Analysis/x Raw Data
/x Old Project/x Data Analysis/x Raw Data/x 2020-06-26.csv
/x Old Project/x Ethics
/x Old Project/x Ethics/x Application.pdf
/x Old Project/x Ethics/x Approval.pdf
/x Old Project/x Ethics/x Informed Consent.docx
到目前为止我所拥有的:
find . -depth (-execdir OR -exec) rename -n ’s/^/x /‘ {} +
find .
递归列出当前工作目录中的所有文件和目录。将输出包含路径的文件名列表。
-depth
指示 find 从最低深度(子目录的底部)开始,这样您就不会遇到由于该路径不再存在而无法找到重命名目录中未重命名的文件的问题。 (如何使用此查找和重命名命令来处理子目录?)
-exec
Find 将对列表中的每个项目执行命名命令(重命名)。
-execdir
Find 将对列表中的每个项目执行命名命令(重命名),有一个区别 - 它将首先进入每个子目录,然后仅将文件名传递给重命名命令(无路径)。
rename
使用 Perl 正则表达式的重命名命令。它无法自行处理递归文件重命名,这就是它需要 find 的原因。显然,它是某些系统上的标准命令,而另一个重命名命令是其他系统上的标准命令,导致一些混乱。
-n
指示重命名以显示将要发生的情况,而不是实际运行它。
’s///‘
告诉 rename 进行替换,将第一部分替换为第二部分。在我的语法 ( ’s/^/x /‘
) 中,将 ^ (文件名开头的标记)替换为 x 。
{}
直接重命名为查找中的文件列表。
+
告诉 find 命令结束。
-exec
相对-execdir
-exec
传递完整的文件路径。重命名作用于重命名文档和类似问题的答案中概述的完整文件路径:
“请注意,重命名将对整个路径进行操作,而不仅仅是文件名。” (http://plasmaturm.org/code/rename/)
“临时说明:有问题 - 重命名模式不处理 >path 的文件名;我正在努力修复”(https://unix.stackexchange.com/a/153489)
因此,如果我使用-exec
,那么我会得到“x /Old Project/Data Analysis/Figures/Figure 1.png”,而不是“/Old Project/Data Analysis/Figures/x Figure 1.png”。为了解决这个问题,我相信我必须编写一个复杂的正则表达式来以某种方式捕获文件名部分,如类似问题的答案中所述:
“如果您只想修改最后一个组件,则可以将正则表达式锚定在 处
(\A|?<=/)
,并确保它不匹配任何 / 且仅匹配最后一个 / 。” (https://unix.stackexchange.com/a/166886)
我尝试了这个答案中给出的正则表达式,但它导致了一个错误(“Quantier 在正则表达式中不遵循任何内容......”),并且我实际上不确定它是否适合我的重命名版本。
execdir
仅传递文件名,这是有希望的。事实上,当我试运行该命令时,所有计划的更改看起来都很完美。然而,实际结果并非如此——它重命名了主目录中的文件和文件夹,但无法找到所有其他文件和文件夹。它说它们不存在。
我最终找到了这个答案:
“查找-execdir |改名
如果不是因为相对路径的疯狂,这将是最好的方法,因为它避免 Perl 正则表达式 fu 仅作用于基本名称:
PATH="$(echo "$PATH" | sed -E 's/(^|:)[^\/][^:]*//g')" \
find a -depth -execdir rename 's/(.*)/\L$1/' '{}' \;
-execdir 首先 cd 进入目录,然后仅对基本名称执行。不幸的是,我无法摆脱 PATH 黑客部分,如果 PATH 中有相对路径,则 find -execdir 拒绝执行任何操作......”(将目录下的所有目录小写)
因此,据我了解,该命令在理论上是有效的,这就是它在试运行中有效的原因,但在实践中,find
它拒绝实际进入每个子目录来执行重命名命令。
我的问题:
- 对于使用
exec
:有没有办法将文件名与完整文件路径隔离以进行重命名? - 对于使用
execdir
:有没有办法要求 find 使用或获取绝对路径名?
笔记
我对编程很陌生。
我发现这个非常彻底的答案(https://stackoverflow.com/a/54163971/13821837)但语法与适用于我的系统的语法不匹配。
答案1
使用格努工具:
首次安装GNU find
通过
brew install findutils
然后:
gfind . -depth -exec rename -n 's@(?<=/)[\s\w\.-]+$@x $&@' {} \;
随着perl
重命名。
-n
当输出看起来不错时拆下开关。
笔记
-depth
这里非常重要,它在重命名目录本身之前遍历目录中的第一个文件。 (降序,此处强制)。- from代表
-n
rename
试运行
查看正则表达式解释。
替换部分x $&
表示文字x
+space
和替换左侧的最后一个完整匹配s///
本地测试:
./Old Project
./Old Project/Manuscript.docx
./Old Project/Data Analysis
./Old Project/Data Analysis/Working Syntax.sps
./Old Project/Data Analysis/Raw data
./Old Project/Data Analysis/Working Data.sav
./Old Project/Data Analysis/Figures
./Old Project/Data Analysis/Figures/Figure 2.png
./Old Project/Data Analysis/Figures/Figure 1.png
./Old Project/Data Analysis/Raw Data
./Old Project/Data Analysis/Raw Data/2020-06-26.csv
./Old Project/Data Analysis/Cleaned Data.sav
./Old Project/Ethics
./Old Project/Ethics/Informed Consent.docx
./Old Project/Ethics/Application.pdf
./Old Project/Ethics/Approval.pdf
./Old Project/Abstract.rtf
处理后:
./x Old Project
./x Old Project/x Manuscript.docx
./x Old Project/x Data Analysis
./x Old Project/x Data Analysis/x Cleaned Data.sav
./x Old Project/x Data Analysis/x Figures
./x Old Project/x Data Analysis/x Figures/x Figure 2.png
./x Old Project/x Data Analysis/x Figures/x Figure 1.png
./x Old Project/x Data Analysis/x Raw Data
./x Old Project/x Data Analysis/x Raw Data/x 2020-06-26.csv
./x Old Project/x Data Analysis/x Raw data
./x Old Project/x Data Analysis/x Working Data.sav
./x Old Project/x Data Analysis/x Working Syntax.sps
./x Old Project/x Ethics
./x Old Project/x Ethics/x Application.pdf
./x Old Project/x Ethics/x Approval.pdf
./x Old Project/x Ethics/x Informed Consent.docx
./x Old Project/x Abstract.rtf