【问题标题】:copying filenames from files of one folder to files of another via bash通过bash将文件名从一个文件夹的文件复制到另一个文件夹的文件
【发布时间】:2020-05-24 08:59:21
【问题描述】:

我有许多不同的文件夹,它们的文件数量完全相同,顺序完全相同。 例如:

Folder1              Folder2            Folder3
  AFile.jpg            9001.jpg           13004.jpg
  BFile.jpg            9002.jpg           13005.jpg
  Cfile.jpg            9003.jpg           13006.jpg

我想将 Folder1 的文件名复制到其他每个文件夹,结果是:

Folder1              Folder2            Folder3
  AFile.jpg            AFile.jpg          AFile.jpg
  BFile.jpg            BFile.jpg          BFile.jpg
  Cfile.jpg            Cfile.jpg          Cfile.jpg

但是,重命名多个文件的每个建议仅使用相同的替换字符串重命名多个文件。

是否有可能通过 bash 脚本执行此操作?

【问题讨论】:

  • 你是如何映射的?有什么特别的顺序吗?
  • 文件在一个文件夹中按编号连续排序,但在不同文件夹中不连续
  • 无论顺序如何,只需运行一个循环来列出第一个文件夹中的文件,提取名称并将其存储到一个数组中。接下来循环其他文件夹并在循环内从数组中分配新文件名。明白了。 ?
  • 就是这么简单,我为什么没想到......如果我让它工作了,我会报告的。谢谢!

标签: bash rename


【解决方案1】:

这里有一些测试目录和文件,只是为了展示一种方法。

创建目录。

mkdir Folder{1..3}

在目录中创建文件。

touch Folder1/{A..C}file.jpg
touch Folder2/{9001..9003}.jpg
touch Folder3/{13004..13006}.jpg

检查文件。

ls Folder{1..3}

输出

Folder1:
Afile.jpg  Bfile.jpg  Cfile.jpg

Folder2:
9001.jpg  9002.jpg  9003.jpg

Folder3:
13004.jpg  13005.jpg  13006.jpg

脚本

#!/usr/bin/env bash

f1=(Folder1/*.jpg)  

 for dir in Folder{2..3}; do
   ( cd "$dir/" || exit; files=(*.jpg); for i in "${!f1[@]}"; do mv -v ${files[$i]}" "${f1[$i]##*/}"; done )
 done

脚本的输出。

renamed '9001.jpg' -> 'Afile.jpg'
renamed '9002.jpg' -> 'Bfile.jpg'
renamed '9003.jpg' -> 'Cfile.jpg'
renamed '13004.jpg' -> 'Afile.jpg'
renamed '13005.jpg' -> 'Bfile.jpg'
renamed '13006.jpg' -> 'Cfile.jpg'

再次检查文件。

ls Folder{1..3}

输出

Folder1:
Afile.jpg  Bfile.jpg  Cfile.jpg

Folder2:
Afile.jpg  Bfile.jpg  Cfile.jpg

Folder3:
Afile.jpg  Bfile.jpg  Cfile.jpg

简要说明 将 *.jpg 文件保存在 Folder1 中的数组中

f1=(Folder1/*.jpg)  
  • 在 Folder2 和 Folder3 中使用循环 cd 并在 cd 失败时退出,因此脚本将立即退出。

  • 将文件夹 2 和文件夹 3 中的 *.jpg 文件保存在名为 files files=(*.jpg) 的数组中

  • 循环遍历f1files 数组的索引,"${!f1[@]}" 中的! 就是这样做的。

"${f1[$i]##*/}" 一种体育形式。 (参数扩展)从文件名中去除路径名。

( ) 中的代码在子 shell 中运行,因此您不必返回启动脚本的上一个目录。

( cd "$dir"/ || exit; files=(*.jpg); for i in "${!f1[@]}"; do mv -v  "${files[$i]}" "${f1[$i]##*/}"; done )

【讨论】:

  • 完美工作,一旦我删除了引号。感谢您的详细回复和解释!!!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-03-01
  • 1970-01-01
  • 2011-08-22
  • 1970-01-01
  • 2023-01-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多