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

思想印迹

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

我想在目录中加上“ 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条评论
登录后参与评论

相关文章

来自分类Dev

使用grep递归查找所有具有字符串“ a”和字符串“ b”的文件

来自分类Dev

递归重命名文件夹/目录

来自分类Dev

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

来自分类Dev

递归bash脚本,用于在Mac / Linux上使用特定规则重命名文件和文件夹

来自分类Dev

CMD迭代并递归重命名所有文件名,并将当前子目录文件夹追加到当前文件名

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

重命名Bash文件夹中的所有文件

来自分类Dev

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

来自分类Dev

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

来自分类Dev

如何在所有文件夹和文件名中替换字符串

来自分类Dev

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

来自分类Dev

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

来自分类Dev

将用户添加到/ public_html /中的特定文件夹

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

递归重命名文件夹

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

使用 PowerShell 重命名给定目录和子文件夹中没有扩展名的所有文件

Related 相关文章

  1. 1

    使用grep递归查找所有具有字符串“ a”和字符串“ b”的文件

  2. 2

    递归重命名文件夹/目录

  3. 3

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

  4. 4

    递归bash脚本,用于在Mac / Linux上使用特定规则重命名文件和文件夹

  5. 5

    CMD迭代并递归重命名所有文件名,并将当前子目录文件夹追加到当前文件名

  6. 6

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

  7. 7

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

  8. 8

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

  9. 9

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

  10. 10

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

  11. 11

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

  12. 12

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

  13. 13

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

  14. 14

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

  15. 15

    重命名Bash文件夹中的所有文件

  16. 16

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

  17. 17

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

  18. 18

    如何在所有文件夹和文件名中替换字符串

  19. 19

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

  20. 20

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

  21. 21

    将用户添加到/ public_html /中的特定文件夹

  22. 22

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

  23. 23

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

  24. 24

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

  25. 25

    递归重命名文件夹

  26. 26

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

  27. 27

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

  28. 28

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

  29. 29

    使用 PowerShell 重命名给定目录和子文件夹中没有扩展名的所有文件

热门标签

归档