使用查找和重命名将用户定义的字符串递归添加到所有文件和文件夹

思想印迹

使用查找和重命名将用户定义的字符串递归添加到所有文件和文件夹。

我想在目录中加上“ 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实际上拒绝进入重命名命令的每个子目录。


我的问题:

  1. 对于使用exec:是否有一种方法可以将文件名与完整文件路径隔离开来进行重命名?
  2. 对于使用execdir:是否有一种方法可以要求find使用或获取绝对路径名?

笔记

我是编程新手。

我发现了这个非常彻底的答案(https://stackoverflow.com/a/54163971/13821837),但是语法与我的系统无法匹配。

吉尔·奎诺(Gilles Quenot)

使用工具:

首先通过安装GNU find

brew install findutils

然后:

gfind . -depth -exec rename -n 's@(?<=/)[\s\w\.-]+$@x $&@' {} \;

随着perl重命名。

-n当输出看起来不错时,请卸下开关。

笔记

  • -depth这很重要,它在重命名目录本身之前先遍历目录中的第一个文件。(降序,此处为必填)。
  • -nrename代表干运行

检查正则表达式的解释

替换部分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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何使用匹配的字符串递归重命名文件夹名和文件名

重命名文件夹中的所有文件,删除重复的字符串部分

从终端递归将所有文件和文件夹重命名为Title Case

重命名所有子目录中的文件和文件夹以删除字符

如何重命名(通过添加前缀)从当前文件夹开始的所有文件和文件夹?

使用php语言重命名所有文件和文件夹ftp

在文件夹,子文件夹和多个文件中递归查找和重命名

Python脚本递归重命名文件夹和子文件夹中的所有文件

如何重命名文件夹中所有不以特定前缀字符串开头的文件?

如何为所有文件和关联的文件夹使用Unicode字符重命名/替换特定的关键字?

批。批量重命名文件夹和所有子文件夹中的文件

如何在Linux上将所有文件夹和文件重命名为小写?

git mv重命名所有文件和文件夹以大写首字母

意外将用户所有文件和文件夹的属性更改为只读

使用grep和sed在所有递归文件中查找和替换字符串

Applescript:将文件夹项目添加到;在没有循环的情况下重命名文件

重命名带有特殊字符的文件和文件夹

Bash脚本将单个随机字符添加到文件夹中的所有文件

php文件重命名和文件夹重命名

如何重命名子文件夹递归下的所有md类型文件?

递归地重命名所有子文件夹中的文件

重命名文件夹中的所有文件也重命名子文件夹

遍历文件夹并使用文件夹名称顺序重命名每个文件夹中的所有文件

使用sed从文件名中移动字符串或使用重命名将其重命名

使用文件夹名称重命名文件夹中的所有图像

根据另一个文件中的字符串重命名文件夹中的文件 - 使用 Python

尝试重命名文件夹中的文件(基于文件名中的字符串)

使用CMake自动将文件夹中的所有文件添加到目标吗?

用“查找”重命名子文件夹中的所有.txt文件