shell 递归重命名文件Mac OSX

iqxoj9l9  于 2023-01-31  发布在  Shell
关注(0)|答案(5)|浏览(171)

尝试重命名一堆文件。
我可以使用以下命令重命名当前目录中的foo with bar示例:

ls . | awk '{print("mv "$1" "$1)}' | sed 's/foo/bar/2' | /bin/sh

我可以添加什么来使它递归?

编辑/我的解决方案

我不知道/理解这种shell类型的东西,所以我用一些(相当肮脏)Ruby:

5.times do
  Dir["**/*"].each do |f|
    file_name = File.absolute_path f
    should_rename = file_name.include? "yolo"
    new_file_name = file_name.gsub("yolo", "#{@project_name}")
    File.rename(f, new_file_name) if (should_rename and File.exists? f)
  end
end
hof1towb

hof1towb1#

有人问:Recursive batch rename
在你的例子中,你可以这样说:

brew install rename
find . -exec rename 's|foo|bar|' {} +
3gtaxfhh

3gtaxfhh2#

rename实用程序还提供了一种不需要regex知识的语法。

brew install rename

选项-s将用bar替换foo的第一个示例:

find . -exec rename -s 'foo' 'bar' {} +

选项-S将替换所有示例:

find . -exec rename -S '_' ' ' {} +

这实际上与Marcel Steinbach上面提供的解决方案相同,只是语法不同。

bvpmtnay

bvpmtnay3#

来自this webpage (archived version)的漂亮、干净、零依赖(所以没有brew install rename或其他东西)。
在这个示例中,我将从.js交换到.ts,以便将项目从vanilla javascript移动到typescript,因此我希望首先将所有项目从 *.js重命名为 *.ts。

find . -iname "*.js" -exec bash -c 'mv "$0" "${0%\.js}.ts"' {} \;

好了搞定。

注意:唯一的问题是你有两个“before”和一个“after”。也就是说,在我的例子中,你有两个.js示例要修改。一个查找.js文件,另一个用.ts替换.js

find . -iname "*.js" -exec bash -c 'mv "$0" "${0%\.js}.ts"' {} \;
   first before ^                   second before ^   ^ one after
s2j5cfk0

s2j5cfk04#

对于“如何在某个文件结构上递归地执行X”的问题,答案几乎总是使用find。在这种情况下,也可以与for循环结合使用。下面的示例将递归地循环当前目录中与模式foo匹配的文件。

thedir=./
for file in $(find $dir -type f -name foo); do
    # rename $file here
done

根据所需的重命名方案以及希望表达重命名的方式,循环体将具有不同的重命名命令。
简单地将每个名为foo的文件重命名为bar会导致一个文件bar,这并不是人们通常想要的。$file变量包含文件的相对路径,因此不同的bar会有不同的路径。

ifmq2ha2

ifmq2ha25#

您也可以使用Finder递归地重命名文件。
1.浏览到需要重命名的项目树所在的文件夹。
1.将Finder窗口切换到“列表”视图。
1.展开所有子文件夹。可使用键盘快捷键完成此操作:-A(Cmd-A,全选),→(右箭头键,展开文件夹)。
1.重复-A、→命令,直到打开所有子文件夹并选中所有文件。
1.右键单击其中一个选定文件,然后选择“重命名xx项...”。
1.使用打开的“重命名Finder项目:“面板来根据需要替换、添加文本或设置文本格式。
1.点击“重命名”

相关问题