我想在目录中加上“ x”(不带引号),并将其所有内容下放到所有子目录中。我是使用macOS Mojave 10.14.6和Terminal的初学者。为此,我使用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
定向查找始于最低深度(在子目录的底部),因此您不会遇到这样的问题:由于该路径已不存在,因此无法在重命名目录中找到未重命名的文件。(如何获取此查找并重命名命令以与子目录一起使用?)
-exec
查找将在列表中的每个项目上执行命名的命令(重命名)。
-execdir
Find将对列表中的每个项目执行命名的命令(重命名),只是有所不同-它会首先进入每个子目录,然后仅将文件名传递给重命名命令(无路径)。
rename
重命名使用Perl正则表达式的命令。它不能自行处理递归文件重命名,这就是为什么需要查找。显然,这在某些系统上是标准命令,而在其他系统上还有另一个重命名命令是标准命令,这会引起一些混乱。
-n
指示重命名以显示将要发生的事情,而不是实际运行它。
’s///‘
告诉rename进行替换,第一部分替换为第二部分。用我的语法(’s/^/x /‘
)将^(文件名开头的标记)替换为x。
{}
引导重命名到find中的文件列表。
+
告诉发现命令已结束。
-exec
相对 -execdir
-exec
沿完整的文件路径传递。重命名作用于完整文件路径,如重命名文档和类似问题的答案中所述:
“请注意,重命名将在整个路径上运行,而不仅仅是文件名。” (http://plasmasturm.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”。为了解决这个问题,我相信我将不得不编写一个复杂的正则表达式来以某种方式仅捕获文件名部分,如对一个类似问题的答案所示:
“如果只想修改最后一个组件,则可以将regexp锚定在
(\A|?<=/)
,并确保它不匹配任何/,而仅匹配最后一个/。” (https://unix.stackexchange.com/a/166886)
我尝试了此答案中给出的正则表达式,但是导致错误(“ Quantier在regex中什么也没有……”),实际上我不确定它是否适用于我的重命名版本。
execdir
传递唯一的文件名,这很有希望。实际上,当我空运行命令时,所有计划的更改看起来都很完美。但是,实际结果并非如此-它重命名了主目录中的文件和文件夹,但找不到所有其他文件和文件夹。它说它们不存在。
我最终找到了这个答案:
“找到-execdir | 改名
如果不是因为相对路径疯狂,这将是最好的方法,因为它避免了Perl regex fu仅对基本名称起作用:
PATH="$(echo "$PATH" | sed -E 's/(^|:)[^\/][^:]*//g')" \
find a -depth -execdir rename 's/(.*)/\L$1/' '{}' \;
-execdir首先将cds放入目录,然后仅对基本名称执行。不幸的是,我无法摆脱PATH hacking部分,如果PATH中有相对路径,则find -execdir拒绝执行任何操作……”(将所有目录都放在目录下)
因此,据我所知,该命令在理论上有效,这就是为什么它在空运行中起作用的原因,但是在实践中,find
实际上拒绝进入重命名命令的每个子目录。
我的问题:
exec
:是否有一种方法可以将文件名与完整文件路径隔离开来进行重命名?execdir
:是否有一种方法可以要求find使用或获取绝对路径名?笔记
我是编程新手。
我发现了这个非常彻底的答案(https://stackoverflow.com/a/54163971/13821837),但是语法与我的系统无法匹配。
使用gnu工具:
首先通过安装GNU find
brew install findutils
然后:
gfind . -depth -exec rename -n 's@(?<=/)[\s\w\.-]+$@x $&@' {} \;
随着perl
重命名。
-n
当输出看起来不错时,请卸下开关。
-depth
这很重要,它在重命名目录本身之前先遍历目录中的第一个文件。(降序,此处为必填)。-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
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句