请求:传输时将 {number} 附加到文件末尾

请求:传输时将 {number} 附加到文件末尾

我有数千个目录,每个目录中都有一个子目录,其中有一个名为file.jpg.由于每个子目录都有一个名为的文件,因此file.jpg我无法将所有这些文件传输到同一个文件夹中,或者它们只是相互覆盖,直到最后一个(一个)file.jpg剩下。

相反,我想将一些命令粘贴到终端中以执行以下操作:

  1. 复制到“审阅”文件夹后,{number}为每个内容添加。file.jpg注意:可能有数千个文件,因此停止位置应该没有限制。file34634657.jpg例如,最后一个文件可以是。

附带问题:是否有任何方法可以追溯到复制file{number}.jpg到其原始目录/子目录?这些file.jpg目录包含可能需要检查的其他子目录和文件。

答案1

如果添加数字不是强制性要求,您可以在文件名中添加路径。这样您就可以解决两个“问题”(覆盖文件并且无法追溯)。

for ef in $(find * -name file.jpg); do cp $ef /path/to/dest_dir/$(echo $ef | sed 's,/,--,g'); done

- find *-*要删除./文件的开头,
- $(echo $ef | sed 's,/,--,g')- 使用 sed 更改/--(使用此命令您将能够追溯,或者您可以使用更具体的内容来代替--)。

编辑(由于下面的OP注释):
如果您的目录包含空白/空格,请更改您的IFS(内部字段分隔符)。
如果需要,您可以备份当前的备份并在命令结束时恢复它。

old_IFS=$IFS; IFS=$'\n'; for ef in $(find * -name file.jpg); do cp $ef dest_dir/$(echo $ef | sed 's,/,--,g;s/ /_/g'); done; IFS=$old_IFS
  • old_IFS=$IFS- 备份当前的 IFS(默认情况下为 、spacetabnewline
  • IFS=$'\n'- 将 IFS 设置为newline(仅newline)以避免分词space
  • IFS=$old_IFS- 将 IFS 恢复为其默认值。

当然,s/ /_/g如果您希望文件(在目标位置)包含目录中的空格,您可以删除第二个 sed 脚本并只保留一个(第一个)。

相关内容